Flash 在重定向后会保留,但常规分配不会

Maz*_*yod 3 elixir phoenix-framework

为了测试这个问题,我创建了一个新的phoenix项目(v1.2.1),并且简单地执行了以下操作:

defmodule Playground.PageController do
  use Playground.Web, :controller

  def index(conn, _params) do
    conn
    |> assign(:test, "test works")
    |> put_flash(:info, "information")
    |> redirect(to: "/sub")
  end

  def sub(conn, _) do
    conn
    |> render("index.html")
  end
end
Run Code Online (Sandbox Code Playgroud)

一旦我请求:indexthrough "/",我就会被重定向到:subthrough "/sub"。由于某种原因,在eex模板中,重定向之前添加的flash可用,但分配不可用。我查看了 Plug 和 Phoenix 代码,但不太明白为什么?

Dog*_*ert 7

我查看了 Plug 和 Phoenix 代码,但不太明白为什么?

Phoenix 中的“flash”值实际上是在发送响应之前使用 Plug 存储的put_session,并且响应是 HTTP 重定向。如果不是,则删除当前的闪存值:

def fetch_flash(conn, _opts \\ []) do
  flash = get_session(conn, "phoenix_flash") || %{}
  conn  = persist_flash(conn, flash)

  register_before_send conn, fn conn ->
    flash = conn.private.phoenix_flash

    cond do
      map_size(flash) == 0 ->
        conn
      conn.status in 300..308 ->
        put_session(conn, "phoenix_flash", flash)
      true ->
        delete_session(conn, "phoenix_flash")
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

来源

另一方面,分配直接存储在conn结构中,并且仅适用于当前请求/响应。如果您想存储某些内容并在下一个请求中访问它,您可以使用Plug.Conn.put_session/3. 像这样的东西:

def index(conn, _params) do
  conn
  |> put_session(:test, "test works")
  |> put_flash(:info, "information")
  |> redirect(to: "/sub")
end

def sub(conn, _) do
  test = get_session(conn, :test)
  conn
  |> assign(:test, test)
  |> render("index.html")
end
Run Code Online (Sandbox Code Playgroud)