12

Plugs のPhoenix Guide に従って、セッションから現在のユーザーをロードする独自のプラグインModule Plug作成しています。プラグ モジュールを使用する@userと は割り当てられませんが、 内でプライベート関数として呼び出すと正常に動作しますrouter.ex

これは私のweb/routerです:

defmodule MyApp.Router do
  use MyApp.Web, :router

  pipeline :browser do
    plug :accepts, ["html"]
    plug :fetch_session
    plug :fetch_flash
    plug :protect_from_forgery
    plug MyApp.Plugs.User
  end

  # Scopes and Routes...

end

これは私のモジュールです(でweb/plugs/user.ex):

defmodule MyApp.Plugs.User do
  import Plug.Conn

  def init(default), do: default

  def call(conn, default) do
    user = %{
      id:       get_session(conn, :user_id),
      username: get_session(conn, :username)
    }

    assign(conn, :user, user)

    IO.inspect conn
  end
end

本当に割り当てられているかどうかを調べてみましたが、そうではありませんでした:

%Plug.Conn{adapter: {Plug.Adapters.Cowboy.Conn, :...}, assigns: %{},
 before_send: [#Function<1.75757453/1 in Plug.CSRFProtection.call/2>,
  #Function<1.30521811/1 in Phoenix.Controller.fetch_flash/2>,
  #Function<0.39713025/1 in Plug.Session.before_send/2>,
  #Function<1.7608073/1 in Plug.Logger.call/2>,
  #Function<0.72065156/1 in Phoenix.LiveReloader.before_send_inject_reloader/1>],
 body_params: %{},
 cookies: ....
4

1 に答える 1

16

Plug.Conn.assign変更された接続を返します。Elixir のすべてのデータは不変であるため、古いデータを変更することはできません。あなたの場合、結果を捨てて、assignconn はまだ古い接続を指しています。おそらく次のようなものが必要です。

conn = assign(conn, :user, user)

connこれにより、変更された接続構造を指すように変数が再バインドされます。もちろんassign(conn, :user, user)、結果が返されるため、関数の最後の式の場合にも機能します。

于 2015-06-23T11:35:51.760 に答える