我需要在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(或assigns[:user_token]assigns.user_token@conn.assigns[:user_token]@conn.assigns.user_token;在所有模板中提供相同的结果)访问任何模板中的 token 。

10-08 17:29