如何在操作

时间:2017-07-22 11:53:43

标签: phoenix-framework

我希望能够在我的控制器模块中定义一个需要访问conn但在任何操作之外的变量,以便我可以在任何操作中使用它:

defmodule Skeleton.Web.PageController do
  use Skeleton.Web, :controller
  locale = conn |> get_session(:locale)

  def news(conn, _params) do
    render(conn, "news.html", locale: locale)"
  end
end

如何访问它?

1 个答案:

答案 0 :(得分:1)

你做不到。编译时,模块中的代码将被评估一次。 conn是为每个请求创建的唯一值,并传递给操作。

您可以覆盖action/2函数来提取并将语言环境传递给每个操作:

def action(conn, _) do
  args = [conn, conn.params, get_session(conn, :locale)]
  apply(__MODULE__, action_name(conn), args)
end

Source

现在,控制器中的每个操作都会获得3个参数,connparamslocale

def news(conn, _params, locale) do
  render(conn, "news.html", locale: locale)"
end

您也可以创建辅助函数,但在这种情况下代码不会短得多,因为您必须明确地将conn传递给它:

def news(conn, _params) do
  render(conn, "news.html", locale: locale(conn))"
end

def locale(conn), do: get_session(conn, :locale)