我希望能够在我的控制器模块中定义一个需要访问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
如何访问它?
答案 0 :(得分:1)
你做不到。编译时,模块中的代码将被评估一次。 conn
是为每个请求创建的唯一值,并传递给操作。
您可以覆盖action/2
函数来提取并将语言环境传递给每个操作:
def action(conn, _) do
args = [conn, conn.params, get_session(conn, :locale)]
apply(__MODULE__, action_name(conn), args)
end
现在,控制器中的每个操作都会获得3个参数,conn
,params
和locale
:
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)