2017-08-10 7 views
2

私はフェニックスのおもちゃプロジェクトに取り組んでいます。フェニックスは本質的には複数ステップの注文ウェブサイトです。順序付けプロセスの各ステップで、前のセッションのセッション変数が設定されていることを確認します。現在、私は本質的には、異なる変数を持つ同じプラグのコピーペーストであるそれぞれのプラグを持っています。ここで"汎用"プラグを作成することはできますか?

はプラグが

defmodule Project.Plugs.RequireDesign do 
    import Plug.Conn 
    import Phoenix.Controller 

    alias Project.Router.Helpers 

    def init(_params) do 
    end 

    def call(conn, _params) do 
    case get_session(conn, :order_design) de 
     nil -> 
     conn 
     |> put_flash(:error, "You must select a design.") 
     |> redirect(to: Helpers.order_path(conn, :design)) 
     |> halt() 
     _ -> 
     conn 
    end 
    end 
end 

どのように見えるかのおもちゃの一例であるセッション変数の原子を取る汎用プラグ、フラッシュで表示するメッセージへのパスを作成することは可能ですにリダイレクト?私は、同じプラグを繰り返し作成するのではなく、それらの変数をとるプラグを1つ持っていたいと思います。

どのような考えですか? :)

EDIT:誰もが、私は同じコントローラに複数回のプラグ私の「ジェネリック」と呼ばれる方法に興味があるならば、私がしたすべては、異なる呼び出しのそれぞれにwhen action in[:my_action]を追加しました。基本的には私がしました

defmodule MyApp.Web.FooController do 
    plug Foo, %{key: :order_design, 
       message: "You must select a design.", 
       path: Helpers.order_path(conn, :design) 
      } when action in [:my_action] 

    ... 
end 

これで、コントローラのさまざまな動作にプラグを複数回使用できるようになりました。私はあなたが逆数、when not action in [:my_action]を使用する場合は、プラグを適用することもできると思います。

答えて

5

プラグに任意のデータを渡すことができます。

defmodule Foo do 
    import Plug.Conn 

    def init(params) do 
    params 
    end 

    def call(conn, %{key: key, message: message, path: path) do 
    case get_session(conn, key) do 
     nil -> 
     conn 
     |> put_flash(:error, message) 
     |> redirect(to: path) 
     |> halt() 
     _ -> 
     conn 
    end 
    end 
end 

次に、あなたが実際に中にそのデータを渡し、完璧だ

defmodule MyApp.Web.FooController do 
    plug Foo, %{key: :order_design, 
       message: "You must select a design.", 
       path: Helpers.order_path(conn, :design) 
      } 

    ... 
end 
+0

!異なる引数を持つ同じコントローラで呼び出すことは可能ですか?申し訳ありません - エリクシールのnoobのビット今すぐ! –

+0

スクラッチは、それを考え出した。ありがとう:) –

関連する問題