2017-10-19 13 views
1

:Rubyでbefore_action:フェニックスのセットアップ同等の私は、このコントローラーを乾燥させるためにしたいと思い

product = Shops.get_product!(id) 
    tax = product.price * 0.15 

私は思いRailsの世界に:すべての関数はこの部分で始まる

defmodule Xyz.ExampleController do 
    use Xyz, :controller 

    alias XyZ.Shops 

    def a(conn, %{"id" => id}) do 
    product = Shops.get_product!(id) 
    tax = product.price * 0.15 

    ... 

    render(conn, "a.html", foobar: foobar, product: product) 
    end 

    def b(conn, %{"id" => id}) do 
    product = Shops.get_product!(id) 
    tax = product.price * 0.15 

    ... 

    render(conn, "b.html", foobar: foobar, tax: tax) 
    end 

    def c(conn, %{"id" => id}) do 
    product = Shops.get_product!(id) 
    tax = product.price * 0.15 

    ... 

    render(conn, "c.html", foobar: foobar) 
    end 

end 

コントローラーをDRYするにはbefore_action :setupと呼ばれるメソッドを置きます。

フェニックスでDRYを達成する最良の方法は何ですか?

+3

プラグイン - > https://hexdocs.pm/phoenix/plug.htmlを使用できます。私はあなたに頼んで、ビジネスロジックをフレームワークモジュールに入れないでください。 – JustMichael

+2

このロジックはコントローラのIMOにあってはなりません。それが私だったら、 '{product、tax} = Shops.get_product_and_tax!(id)'のように動作する関数を定義し、それを各アクションから呼び出します。 – Dogbert

+0

それよりもやるよ。私はそれをプラグに入れるのがよりクリーンであると思った。しかし、私は各アクションに1行のコードを残しておきます。 – wintermeyer

答えて

1

コントローラーメソッドaction/2を使用することができます。

コントローラはプラグであるため、彼らは両方とも、それはまた、プラグ、スタックした後、適切な処置を派遣 する責任があるアクション/ 2という名前の関数を提供し /1を初期化および/ 2を呼び出し、実装:controller docsから(また、 も上書き可能です)。本Programming Phoenixクリス・マッコードが、このようなすべてのコントローラ機能に共通するパラメータを置くために、このアクションを使用して

def​ action(conn, _) ​do​ 
​ apply(__MODULE__, action_name(conn), [conn, conn.params, conn.assigns.current_user]) 
​end​ 

のでindex/2のようなすべてのアクションが今index/3であり、第3のように、現在のユーザーを持っていますパラメータ。

これはおそらくあなたを助けることができますか?

+1

私はこのアプローチを使用するほうがプラグより優れているとは思えません。柔軟性が低く、この状況ではプラグよりも利点がありません。 – JustMichael

関連する問題