在多个模块中使用Elixir Plug.conn.assigns

时间:2016-12-18 08:41:32

标签: elixir phoenix-framework plug

我在Phoenix项目中的session_controller.ex将current_useruser_token分配给Conn,如下所示。

def create(%Plug.Conn{private: %{openmaize_user: %{id: id}}} = conn, _params) do
    username = conn.private.openmaize_user.username
    IO.inspect("SessionController create: username")

    conn = conn
    |> put_current_user(username)
    |> put_session(:user_id, id)
    |> auth_info("You have been logged in", user_path(conn, :index))
  end


defp put_current_user(conn, username) do
    token = Phoenix.Token.sign(conn, "user socket", conn.private.openmaize_user.username)

    conn = conn
    |> assign(:current_user, username)
    |> assign(:user_token, token)
  end

然后我尝试通过Plug.Conn在另一个模块中使用current_user,如下所示,但此时Conn.assigns为空。(" current_user"字段只是一个示例,并且它可以是任何领域)。

问题是如何为Conn分配值以及如何在其他模块中使用这些值。

defmodule MyApp.GraphQLSession do
  import Plug.Conn 
  alias MyApp.{Repo, User}
  use MyApp.Web, :controller

  def root_eval(conn) do
    %{current_user: conn.assigns[:current_user]}

会话控制器中的Conn (成功分配值)

%Plug.Conn{adapter: {Plug.Adapters.Cowboy.Conn, :...},
 assigns: %{current_user: "User A",
   user_token: "SFMyNTY.g3QAAAACZAAEZGF0YW0AAAAHLIL1VECezSDyQ"},

在SessionController之外的模块中使用Conn

%Plug.Conn{adapter: {Plug.Adapters.Cowboy.Conn, :...}, **assigns: %{}**,..... nil

0 个答案:

没有答案