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

标签 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

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

最佳答案

I've looked at the Plug and Phoenix code, and can't really understand why?

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

Source

另一方面,分配直接存储在 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

关于elixir - 重定向后 Flash 会保留,但常规分配不会,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39707429/

相关文章:

elixir - Elixir 是否支持自省(introspection)以显示可用功能?

elixir - String.replace 返回字符串的二进制表示

build - 编写一个在 deps.get 之后运行的 Mix 任务

linux - 如何在服务器上正确安装 Erlang、Elixir 和 mix?

elixir - 毒药无法编码错误消息

authentication - 在没有模型的情况下使用 Guardian

docker - 如何使用elixir phoenix版本和指南中的示例MyApp.Release.rollback在Docker容器中回滚数据库

elixir - 使用 Elixir 的简单、高效的 FIFO 队列

json - 在 Elixir/Phoenix 应用程序中解析 JSON,不是在 Controller 或模型内部,而是从 "/lib"解析

terminal - Phoenix : How to get conn %Plug. Conn{} 在控制台中