为什么将赋值中的值从一个控制器传递给另一个控制器不起作用?

Why passing a value in assigns from one controller to another is not working?

我正在更改默认的 CRUD 控制器操作,因此我的 page_controller.ex:

def main(conn, _params) do
        empresas = Repo.all(Empresa)
        changesetEmpresas = Empresa.changeset(%Empresa{})
        scrollTo = conn.assigns.scrollTo
        render(conn, "main.html", changesetEmpresas: changesetEmpresas, empresas: empresas, scrollTo: scrollTo)
    end

这会处理 /mainEmpresas 的请求。 然后我在 empresa_controller.ex 中有这段代码来处理 create 操作:

  def create(conn, %{"empresa" => empresa_params}) do
    changeset = Empresa.changeset(%Empresa{}, empresa_params)

    case Repo.insert(changeset) do
      {:ok, _empresa} ->
        conn
        |> put_flash(:info, "Empresa criada com sucesso.")
        |> assign(:scrollTo, "bottom")
        |> redirect(to: "/mainEmpresas")

      {:error, changeset} ->
        render(conn, "newError.html", changesetEmpresas: changeset)
    end
  end

我的目标是将 scrollTo 的值 bottom 从我在 empresa_controller.ex 中的 create 操作传递到我在 [=] 中的 main 操作12=] 以某种方式,当我重定向到 /mainEmpresas 时,我在那里可以使用它,但我无法做到。

此外,我想保证当没有 scrollTo 值被传递时 scrollTo = conn.assigns.scrollTo 不会中断。

您的问题是 conn 仅适用于每个请求。重定向将创建一个由您的客户创建的新请求和一个新的 conn。 解决方案是将 scrollTo 值作为 GET 参数。

致电redirect(conn, to: empresas_path(conn, :main, %{scrollTo: "bottom"}))redirect(conn, to: "/mainEmpresas?scrollTo=bottom")

并将您的 empresa_controller.ex 更改为以下内容:

def main(conn, %{"scrollTo" => scrollTo}) do
    # With 'scrollTo' parameter
end

def main(conn, _params) do
    # Without 'scrollTo' parameter
end

希望对您有所帮助。