我需要在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 。