gpt4 book ai didi

token - 使 conn.assigns 在多个 Phoenix View /模板中可用

转载 作者:行者123 更新时间:2023-12-04 14:40:48 24 4
gpt4 key购买 nike

我需要在 SessionController 中定义的用户身份验证 token 可在 layout/app.html.eex 中使用.

我的 SessionController 定义了一个 token 并将其分配给 conn .

token = Phoenix.Token.sign(conn, "user socket", user)

assign(conn, :user_token, token)

然后当我尝试使用 app.html.eex 中的 token 时像下面这样,
 <script>window.userToken = "<%= assigns[:user_token] %>"</script>

or

<script>window.userToken = "<%= @user_token %>"</script>

我收到此错误: (ArgumentError) assign @user_token not available in eex template.

最佳答案

conn.assigns每次请求都会重置。如果您想在 SessionController 中存储一些东西并在将来的请求中提供它,您可以使用 put_session ;

在你的 SessionController 中:

token = Phoenix.Token.sign(conn, "user socket", user)
conn
|> put_session(:user_token, token)
|> render(...)

然后,要在其他 Controller 中访问它,您可以使用:
token = get_session(conn, :user_token)

要在多个模板中访问它,您可以在路由器中的适当管道中添加一个插件:
pipeline :browser do
...
plug :fetch_user_token
end

...

def fetch_user_token(conn, _) do
conn
|> assign(:user_token, get_session(conn, :user_token))
end

现在您可以使用 @user_token 访问任何模板中的 token (或 assigns[:user_token]assigns.user_token@conn.assigns[:user_token]@conn.assigns.user_token ;在这里都会给出相同的结果)。

关于token - 使 conn.assigns 在多个 Phoenix View /模板中可用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41073512/

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