/var/log/messages

Apr 17, 2019 - 2 minute read - Comments - programming

phoenix excersize (10)

今回からは Views の確認。ぢつは fukuoka.ex なスライド横目にもくもくしていたり。

  • Phoenix の View には二つの主な仕事
  • 一つはテンプレートのレンダリング
  • render/3 がレンダリングに関する中心的な機能を提供
  • View は生データを受け取りテンプレートが使いやすいようにする機能も提供

Rendering Templates

  • Controller は web/templates/page ディレクトリにテンプレートをレンダリングするための PageView を必要とする
  • 必要に応じて Phoenix がテンプレートルートとみなすディレクトリが変更できる
  • 新しく生成 Phoenix アプリケーションは三つの View Module を持ち、それらは全て web/views 配下にある
    • ErrorView, LayoutView, PageVIew

layout_view.ex が以下。

defmodule Hello.LayoutView do
  use Hello.Web, :view
end
  • 一行のみ
  • view/0 を呼び出す
  • view/0 は Phoenix.View モジュールで __using__ マクロを実行
  • View はテンプレートで使用するための関数を置く場所

例として以下なナニが紹介されています。まず、lib/templates/layout/app.html.eex の一部が以下で

    <title>Hello Hello!</title>
    <link rel="stylesheet" href="<%= static_path(@conn, "/css/app.css") %>">
  </head>

title なナニを以下に修正な模様。

<title><%= title() %></title>

で、LayoutView を以下のように修正、とのこと。

defmodule HelloWeb.LayoutView do
  use HelloWeb, :view

  def title do
    "Awesome New Title!"
  end
end
  • 手続き呼び出しは <%=%> で囲むとのこと
  • = が無い場合でもコードは実行される (出力はない)
  • LayoutView が実際にレンダリングするので title/0 を修飾する必要はない
  • Phoenix のテンプレートは実際には view module 上の単なる関数定義

試す例の紹介。

  • web/templates/page/index.html.eex を削除して
  • 以下を web/views/page_view.ex の PageView モジュールに追加
defmodule HelloWeb.PageView do
  use HelloWeb, :view

  def render("index.html", assigns) do
    "rendering with assigns #{inspect Map.keys(assigns)}"
  end
end
  • これ、関数パタンマッチの使用例ですね
  • サーバ起動して index アクションにアクセスしたら render の戻りがヘッダに出力される模様
  • コンパイル時に Phoenix は全ての *.html.eex をプリコンパイルしてそれぞれの View Module の render/2 関数句に返還
  • 実行時にはすべてのテンプレートは既にメモリにロードされている
  • view/0*_path な Route なエイリアスを作ってくれる模様

いったん

エントリ投入します。継続は Views の More About Views の項。

phoenix excersize (9) phoenix excersize (11)

comments powered by Disqus