2017-05-29 37 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 
相关问题