Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Elixir 在重定向后,闪存会被持久化,但常规分配不会被持久化_Elixir_Phoenix Framework - Fatal编程技术网

Elixir 在重定向后,闪存会被持久化,但常规分配不会被持久化

Elixir 在重定向后,闪存会被持久化,但常规分配不会被持久化,elixir,phoenix-framework,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") |> re

为了测试这个问题,我创建了一个新的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-through/,我就被重定向到:sub-through/sub。由于某种原因,在eex模板中,在重定向可用之前添加的闪存可用,但分配不可用。我看了一下Plug和Phoenix代码,真的不明白为什么

我看了一下Plug和Phoenix代码,真的不明白为什么

Phoenix中的闪存值实际上是使用Plug的put_会话存储的,就在发送响应之前,响应是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结构中,仅可用于当前请求/响应。如果要存储某些内容并在下一个请求中访问它,可以使用。大概是这样的:

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
我看了一下Plug和Phoenix代码,真的不明白为什么

Phoenix中的闪存值实际上是使用Plug的put_会话存储的,就在发送响应之前,响应是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结构中,仅可用于当前请求/响应。如果要存储某些内容并在下一个请求中访问它,可以使用。大概是这样的:

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