使conn.assigns在多个Phoenix视图/模板中可用

Jas*_* O. 6 token elixir phoenix-framework

我需要在定义用户身份验证令牌SessionController为处于可用layout/app.html.eex.

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

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

assign(conn, :user_token, token)
Run Code Online (Sandbox Code Playgroud)

然后,当我尝试app.html.eex像下面这样使用令牌时,

 <script>window.userToken = "<%= assigns[:user_token] %>"</script>

or

 <script>window.userToken = "<%= @user_token %>"</script>
Run Code Online (Sandbox Code Playgroud)

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

Dog*_*ert 7

conn.assigns每次请求都会重置.如果您想要存储某些内容SessionController并在将来的请求中使用它,您可以使用put_session;

在SessionController中:

token = Phoenix.Token.sign(conn, "user socket", user)
conn
|> put_session(:user_token, token)
|> render(...)
Run Code Online (Sandbox Code Playgroud)

然后,要在其他控制器中访问它,您可以使用:

token = get_session(conn, :user_token)
Run Code Online (Sandbox Code Playgroud)

要在多个模板中访问它,您可以将插件添加到路由器中的相应管道:

pipeline :browser do
  ...
  plug :fetch_user_token
end

...

def fetch_user_token(conn, _) do
  conn
  |> assign(:user_token, get_session(conn, :user_token))
end
Run Code Online (Sandbox Code Playgroud)

现在,您可以使用@user_token(或assigns[:user_token]assigns.user_token@conn.assigns[:user_token]@conn.assigns.user_token所有将在此处给出相同结果)访问任何模板中的令牌.