为了测试这个问题,我创建了一个新的 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"被重定向到
。由于某种原因,在 eex 模板中,在重定向之前添加的 flash 可用,但分配不可用。我看过 Plug 和 Phoenix 的代码,但真的不明白为什么?:sub
最佳答案
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
另一方面,分配直接存储在 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/