【问题标题】:Flash is persisted after redirect, but regular assign is notFlash 在重定向后仍然存在,但常规分配不是
【发布时间】:2016-09-28 01:53:01
【问题描述】:

为了测试这个问题,我创建了一个新的 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 可用,但 assign 不可用。看了 Plug 和 Phoenix 的代码,不明白为什么?

【问题讨论】:

    标签: elixir phoenix-framework


    【解决方案1】:

    我查看了 Plug 和 Phoenix 的代码,并不能真正理解为什么?

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

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-27
      • 2022-12-13
      • 2010-12-06
      • 2011-03-28
      • 2012-10-13
      • 1970-01-01
      • 2016-03-04
      • 1970-01-01
      相关资源
      最近更新 更多