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

时间:2016-03-27 17:13:15

标签: phoenix-framework

我正在更改默认的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的值bottomcreate empresa_controller.ex行动传递到main page_controller.ex行动/mainEmpresas以某种方式,当我重定向到scrollTo时,我可以在那里使用它,但我无法做到。

此外,我还要保证,当没有scrollTo = conn.assigns.scrollTo值传递时,{{1}}不会中断。

1 个答案:

答案 0 :(得分:2)

这里的问题是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

希望有所帮助。