2016-12-10 55 views
5

我需要在SessionController中定義的用戶認證令牌在layout/app.html.eex中可用。在多個Phoenix視圖/模板中創建連接分配

我的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.

回答

6

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;所有會在這裏給出相同的結果)。

相關問題