2017-05-29 79 views
0

我需要從我的conn.assigns一些信息在我的頻道。例如:獲取渠道受讓人康涅狄格州鳳凰框架

def handle_in("save", params, socket) do 
    values = Poison.decode!(params) 

    current_user = conn.assigns.current_user 
    changeset = 
     current_user 
     |> build_assoc(:posts) 
     |> Post.changeset(values) 

    case Repo.insert(changeset) do 
     {:ok, _} -> 
     {:reply, :ok, socket} 
     {:error, reason} -> 
     {:reply, {:error, %{:msg => reason}}, socket} 
    end 
    end 

但很明顯,conn將在這裏不可用。我應該怎樣去獲得的轉讓?

回答

2

插座具有一個assigns鏡像上的康恩受讓人。

如果你想獲得用戶,則需要在插座上連接時使用的Phoenix.Token.sign/4函數並傳遞價值。

像這樣的事情在你的模板:

<%= tag :meta, name: "channel_token", content: Phoenix.Token.sign(@conn, "user", @current_user.id) %> 

這在您的JS:

const token = document.querySelector('meta[name=channel_token]').getAttribute('content'); 
const socket = new Socket('/socket', {params: {token: token}}); 

然後,您可以驗證令牌位於插座像這樣(摘自the docs):

defmodule MyApp.UserSocket do 
    use Phoenix.Socket 

    def connect(%{"token" => token}, socket) do 
    # Max age of 2 weeks (1209600 seconds) 
    case Phoenix.Token.verify(socket, "user", token, max_age: 1209600) do 
     {:ok, user_id} -> 
     socket = assign(socket, :user, Repo.get!(User, user_id)) 
     {:ok, socket} 
     {:error, _} -> 
     :error 
    end 
    end 
end