gpt4 book ai didi

elixir - 将数据注入(inject) Phoenix 的 Action 参数

转载 作者:行者123 更新时间:2023-12-02 07:20:14 26 4
gpt4 key购买 nike

我正在尝试编写一些插件来减少项目中不需要的代码量,我希望获取一些 session 数据并将其放入 Controller 操作中的 _params 中。但我不知道该怎么做。我遇到了函数 allocate/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

最佳答案

Plug.Conn 结构体上有两个位置可以存储键值对。 assignsprivate 。一般来说,您应该为应用程序使用assigns,为库使用private

This storage is meant to be used by libraries and frameworks to avoid writing to the user storage (the :assigns field). It is recommended for libraries/frameworks to prefix the keys with the library name.

使用分配获取您的用户:

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

如果您经常在 Controller 函数中使用 current_user ,请考虑覆盖 Controller 中的 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 是一个 map :

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

关于elixir - 将数据注入(inject) Phoenix 的 Action 参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34175542/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com