Phoenix でControllerから渡されているか不明な変数を参照する

Elixir Phoenix Web
更新2020/10/22
RailsのViewではControllerで定義されていないインスタンス変数を参照しても問題ありませんがPhoenixではどうするのか悩みました。

結論

contorllerから渡されてるかわからない hoge という変数を参照しようとするとき
assigns[:hogehoge]
とすると、controllerで定義されている場合はその値を、定義されていない場合は nil を返すようです。

例えば、特定のページではヘッダーを表示したくないとき

assigns[:no_header]
のようにして、controller からno_headerが渡されていたら処理を分岐するような処理を書くようなことに使えそう。


余談

いったい  assignsとはなんなのか。
controller でViewを指定する際に、一緒に変数を渡すが、これがすなわちassignsのようだ
render(module, template, assigns)
View側で下記のようにすると assigns の中身がログに表れる。
<% IO.inspect assigns  %>
これがその中身だ。こう見ると、assignsはただのマップのように見える。
%{
  changeset: #Ecto.Changeset<
    action: nil,
    changes: %{},
    errors: [body: {"can't be blank", [validation: :required]}],
    data: #HogeFuga.Articles.Article<>,
    valid?: false
  >,
  conn: %Plug.Conn{
    adapter: {Plug.Cowboy.Conn, :...},
    assigns: %{
      changeset: #Ecto.Changeset<
        action: nil,
  ...
  ....
  .....

  text: "hogehoge",
  view_module: HogeFugaWeb.Admin.ArticleView,
  view_template: "new.html"
}
つまり、assignsという名前のmapから該当のキーを呼び出しているような挙動をしてると捉えることもできるのかもしれない。

ちなみに 、この assignsにあるkeyに @ をつけると参照できるようで、たとえば
<%= @view_template %>
のようにしても現在のViewファイルの名前を取得することができた。
書いた人/このブログについて

サーバーサイドエンジニア。お仕事ではRubyとPerl。趣味ではC#やHLSLなどを少しと、3DCGでPythonをごまかしながら使う感じ。Unityとインフラ周りも好き。

自分の備忘録もGoogle検索に任せたくてこのブログ書いてる。Phoenix製でEC2上で稼働中。