使 conn.assigns 在多个 Phoenix views/templates 中可用
Making conn.assigns available in multiple Phoenix views/templates
我需要 SessionController
中定义的用户身份验证令牌才能在 layout/app.html.eex
中使用。
我的 SessionController 定义了一个令牌并将其分配给 conn
。
token = Phoenix.Token.sign(conn, "user socket", user)
assign(conn, :user_token, token)
然后当我尝试像下面这样使用 app.html.eex
中的令牌时,
<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(...)
然后,要在其他控制器中访问它,您可以使用:
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
访问任何模板中的令牌;所有这些都将提供这里的结果相同)。
我需要 SessionController
中定义的用户身份验证令牌才能在 layout/app.html.eex
中使用。
我的 SessionController 定义了一个令牌并将其分配给 conn
。
token = Phoenix.Token.sign(conn, "user socket", user)
assign(conn, :user_token, token)
然后当我尝试像下面这样使用 app.html.eex
中的令牌时,
<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(...)
然后,要在其他控制器中访问它,您可以使用:
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
访问任何模板中的令牌;所有这些都将提供这里的结果相同)。