چطور می شه جلوی تکرار اینطور فانکشن هارو گرفت

با درود خدمت شما دوستان گرامی و اساتید محترم . یک فانکشن تست می زارم خدمتتون در فانکشن زیر فقط create_post_category_cms_sender تغییر می کنه و بقیه هیچ تغییری نخواهند کرد . چیجوری می شه یک فانکشن با اینچنین ورودی رو در پارامتر های فانکشن test گرفت . اگر چنین چیزی درست بشه می تونم تقریبا ۸۰ درصد یکی از فایل هامو بهبود بدم

def test() do
  with {:ok, %{acl: "admin", info: _info}} <- TrangellApiGateway.User.Login.user_acl_check(allreq),
            {:ok, ms} <- http_error_handeller(conn, Post.create_post_category_cms_sender(allreq), "created")  do
            conn
            |> put_status(201)
            |> json(%{message: ms})  
      else
            _ ->
               conn
               |> put_status(400)
               |> json(%{error: "Your request is invalid."}) 
      end
end

با تشکر

action fallback دقیقن برای این کاره زمانی که پترن های همه کنترولر ها مچ نشه در آخر action fallback فراخوانی میشه قبلا صحبت شو یک جا کردیم
https://swanros.com/2017/03/04/action-fallback-contexts-phoenix1-3-tiny-controllers/

1 پسندیده

درود سام عزیز. آره قبلا صحبت کردیم ولی اون موقع هم متوجه اش نشدم از داکیومنت الکسیر . نتونستم ازش استفاده کنم

خیلی ساده هستش یک کنترل به نام fallback درست میکنی که بعد همه کنترلر ها اگر پترن مچ نشد سعی میکنه با اون مچ کنه

1 پسندیده

سام عزیز . این پترن مچ می کنه فکر کنم . ولی من به دنبال اینم که در قطعه کد بالا که نوشتم Post.create_post_category_cms_sender(allreq) حالا بودون تغییر بقیه کد بیام مثلا بزنم Post.name(allreq) آیا fallback این کارو می کنه ؟

بله به کد لینک بالا نگاه کن شبیه کاریه که میخواهی انجام بدی

1 پسندیده

درود سام عزیز خیلی ممنون خیلی کاربردی بود . من پستی که شما لطف کردید قرار دادید را خوندم زیاد متوجه نشدم ولی رفتم داکیومنت خوندم متوجه شدم می تونم خیلی از بخش های ارور هامو که تو هر فانکشن تکرار کردم رو می تونم با این کار حذف کنم . فقط نیاز هست یک کنترلر درست کنم و چندین حالت براش تعریف کنم

https://hexdocs.pm/phoenix/Phoenix.Controller.html#action_fallback/1

کاشکی زودتر یادم می اومد شما زحمت کشیده بودید قبلا معرفی کرده بوددیدش ولی من متاسفانه سام عزیز نتونستم کاری که می خواستم در پست اول یعنی جایگزینی فانکشن رو عملی کنم شاید سوالمو بد پرسیدم .

شما فرض کنید این چنین فانکشن هایی داریم

  def create_post_category_cms_sender(params) do
    post_sender_json_without_authorization(params, "post/create-category")
  end

  def edit_post_category_cms_sender(params) do
    put_sender_json_without_authorization(params, "post/edit-category")
  end

  def delete_post_category_cms_sender(params) do
    delete_sender_json_without_authorization(params, "post/delete-category")
  end

  def info_category_all_post_cms_sender(params) do
    post_sender_json_without_authorization(params, "post/all-category")
  end

  def get_posts_category_cms_sender(params) do
    post_sender_json_without_authorization(params, "post/category")
  end

  def create_cms_post_cms_sender(params) do
    post_sender_json_without_authorization(params, "post/create-post")
  end

هر کدوم از این ها اطلاعات رو به روتری خاص می فرستند . چرا تکرار شده باید بگم ممکنه بعدا توی هر کدوم اطلاعات بیشتری بخوام به همین منظور کمی تکراری شده ولی مشکل اینجا نیست

حالا کدی که این هارو فراخوانی می کنه کد زیر هست که در پست اول قرار دادم .

with {:ok, %{acl: "admin", info: _info}} <- TrangellApiGateway.User.Login.user_acl_check(allreq),
         {:ok, ms} <- http_error_handeller(conn, Post.create_cms_post_cms_sender(allreq), "created")  do
         conn
         |> put_status(200)
         |> json(%{message: ms})  
      else
         _ ->
            conn
            |> put_status(400)
            |> json(%{error: "Your request is invalid."}) 
      end 

حالا در این هر سری باید یک فانکشن بزارم . لازم به ذکر هست ارور همشون یک جور هست با این fallback می شه همشون حذف کرد خیلی خوبه
ولی متاسفانه

http_error_handeller(conn, Post.create_cms_post_cms_sender(allreq), "created")

هر سری داره تکرار می شه. می خوام این گزینه حذف بشه و هر سری من تکرارش نکنم . البته اینجا اصلا لزومی نداره چون خودش خلاصه شده کد هست و با فال بک ارور ها پاک می شه و خودش به اندازه کافی بهینه سازی شده ولی بعدا شاید کدی بهم بربخوره که نیاز دارم فانکشن وسط کد هی تغییر کنه چطور باید عمل بشه

یکی بهم این راه رو پیشنهاد داد

def test_1(), do: test(:name)
def test_2(), do: test(:other_name)

defp test(function_name) do
  with {:ok, %{acl: "admin", info: _info}} <- TrangellApiGateway.User.Login.user_acl_check(allreq),
            {:ok, ms} <- http_error_handeller(conn, apply(Post, function_name, [allreq]), "created")  do
            conn
            |> put_status(201)
            |> json(%{message: ms})  
      else
            _ ->
               conn
               |> put_status(400)
               |> json(%{error: "Your request is invalid."}) 
      end
end

به روز رسانی

پستی که زدم تکمیل تر شد به همین منظور در اینجا هم لینکشو قرار می دم هم پیشنهاد یکی دیگر از کاربران انجمن الکسیر . اگر دوستان فکر می کنند در این راه ها مشکلی هست لطفا تذکر دهند

منبع :

I think it is better to pass a lambda as an argument to test function. 
In this case, compiler can catch errors if function or module doesn’t exist.

نمونه کد پیشنهاد شده :

def test_1(), do: test(&Post.name/1)
def test_2(), do: test(&Post.other_name/1)
1 پسندیده