2017-07-22 6 views
0

コントローラモジュールのconnにアクセスする必要のある変数を定義できますが、どのアクションでも使用できるようにするには、アクションの外側のコントローラモジュールで '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

できません。モジュール内のコードは、コンパイル時に一度評価されます。 connは、リクエストごとに作成され、アクションに渡される一意の値です。

あなたが抽出し、各アクションにロケールを渡すaction/2関数をオーバーライドすることができます:

Source

def action(conn, _) do 
    args = [conn, conn.params, get_session(conn, :locale)] 
    apply(__MODULE__, action_name(conn), args) 
end 
今すぐコントローラ内の各アクションは3つの引数、 connparamsを取得すると、 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) 
関連する問題