使用Plug.Router语法在init上传递的Plug,use选项

时间:2015-10-12 10:13:46

标签: elixir phoenix-framework

我正在使用Plug,我想了解。

我的代码如下:

defmodule Numerino.Plug do
  use Plug.Router
  use Plug.Debugger

  plug :put_resp_content_type, "application/json"
  plug :match
  plug :dispatch

  def init options do
    IO.inspect options
    options
  end

  get "/" do
    conn
    |> IO.inspect
    |> send_resp(201, "world")
  end

  match _ do
    send_resp(conn, 404, "Not found.")
  end

end

在get中我需要使用option作为参数传递。

如何访问保持相同Plug.Router语法的选项?

2 个答案:

答案 0 :(得分:4)

您还没有说明为什么要这样做,所以我只能给出一般答案。如果您有特定的用例,那么可能会有更好的解决方案。

您可以通过向路由器添加额外的插件来实现此目的,该路由器将选项存储在conn的私有存储中:

$scope.test = {
 testMin : 0,
 testMax : 50000,
 testVal : 10000,
 testStep : 5000
};

然后可以使用plug :opts_to_private defp opts_to_private(conn, opts) do put_private(conn, :my_app_opts, opts) end

在您的路线中访问此内容
conn.private.my_app_opts

调度函数是defoverridable/1,所以你也可以通过覆盖函数来做同样的事情:

get "/" do
  conn.private.my_app_opts
  |> IO.inspect

  conn
  |> send_resp(201, "world")
end

但是我发现定义了一个新功能,例如defp dispatch(conn, opts) do conn = put_private(conn, :my_app_opts, opts) super(conn, opts) end cleaner。

答案 1 :(得分:0)

您只需要覆盖呼叫回调:

  def call(conn, opts) do
    put_private(conn, :opts, opts)
    |> super(opts)
  end