2017-08-10 52 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 

是否有可能创建一个通用插头,需要一个原子一个会话变量的玩具例子,一个消息在闪存和路径显示重定向到?我希望有一个插件能够接受这些变量,而不是一遍又一遍地创建相同的插件。

有什么想法? :)

编辑:如果任何人有兴趣我怎么叫我的“通用”在同一个控制器插头多次,我所做的就是添加一个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

这是完美的!是否可以用不同的参数在同一个控制器中调用它?对不起 - 现在一点Elixir noob的! –

+0

划痕,想通了。谢谢 :) –