将数据注入Phoenix的Action params

时间:2015-12-09 09:47:36

标签: elixir phoenix-framework

我尝试编写一些插件来减少项目中不需要的代码量,我很乐意将一些会话数据放入控制器操作中的_params中。但我不知道该怎么做。我遇到了functon assign / 3但据我所知它分配了要在模板中使用的数据。

def logged(conn, _opts) do
    case get_session(conn, :login) do
      nil -> conn
        |> Phoenix.Controller.put_flash(:error, "Musisz być zalogowany")
        |> Phoenix.Controller.redirect( to: "/")
        |> Plug.Conn.halt
      login -> #here
    end
  end

我希望能够做到:

def someaction(conn, %{"login" => login}) do
  #do something with login
end

1 个答案:

答案 0 :(得分:9)

有两个地方可以在Plug.Conn结构上存储键值对。 assignsprivate。通常,您应该为您的应用程序使用assigns,为库使用private

  

此存储旨在供库和框架使用,以避免写入用户存储(:assignigns字段)。建议库/框架使用库名称为密钥添加前缀。

使用assign让您的用户:

def logged(conn, _opts) do
    case get_session(conn, :login) do
      nil -> conn
        ...
      login -> Plug.Conn.assign(conn, :current_user, login)
    end
  end

def someaction(conn, _params) do
  # do something with conn.assigns.current_user
end

如果经常在控制器功能中使用current_user,请考虑覆盖控制器中的action/2功能。如the docs

中的“覆盖action/2自定义参数”中所述
def action(conn, _params) do
  apply(__MODULE__, action_name(conn), [conn, conn.params, conn.assigns.current_user)
end

def someaction(conn, _params, current_user) do
  # do something with current_user
end

完整性。您可以使用Kernel.update_in/2更新参数(我不会在用户身份验证的情况下),因为conn.params是地图:

update_in(conn.params, fn (params) -> Map.put(params, :something, "value") end)