2016-12-10 4 views
5

SessionControllerで定義されたユーザー認証トークンがlayout/app.html.eexで利用可能になる必要があります。複数のPhoenixビュー/テンプレートでconn.assignsを利用できるようにする

私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。すべてここで同じ結果が得られます)。

関連する問題