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

Posted

技术标签:

【中文标题】使 conn.assigns 在多个 Phoenix 视图/模板中可用【英文标题】:Making conn.assigns available in multiple Phoenix views/templates 【发布时间】:2017-04-25 16:55:19 【问题描述】:

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

【问题讨论】:

【参考方案1】:

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]@conn.assigns.user_token,在任何模板中访问令牌;所有这些都将在此处给出相同的结果)。

【讨论】:

以上是关于使 conn.assigns 在多个 Phoenix 视图/模板中可用的主要内容,如果未能解决你的问题,请参考以下文章

HBase集成phoniex

浅谈Phoenix在HBase中的应用

如何使用 GridPane JavaFX 使按钮跨越多个列/行?

在 UIcollectionview 中使多个单元格出列的方法

如何使多个公式行在组织模式表中工作

如何使全局变量在多个 google appengine 实例上保持不变?