Views の章はおもしろかったです。次は Templates とのこと。
- Phoenix のテンプレートはプリコンパイルされているため、高速
- eex は Phoenix のデフォルトのテンプレートシステムであり、erb と似ている
- デフォルトではテンプレートでは
web/tempates
ディレクトリに格納
Examples
- テンプレートの使用方法については Adding Pages Guide あるいは Views Guide を参照のこと
web/web.ex
について (view ブロック?)- 手元にあるサンプルは以下なカンジ
def view do
quote do
use Phoenix.View, root: "web/templates"
# Import convenience functions from controllers
import Phoenix.Controller, only: [get_csrf_token: 0, get_flash: 2, view_module: 1]
# Use all HTML functionality (forms, tags, etc)
use Phoenix.HTML
import Hello.Router.Helpers
import Hello.ErrorHelpers
import Hello.Gettext
end
end
quote
してますね、あるいは色々なさってるのがわかります- 色々試せるように route を追加しています (
web/router.ex
)
scope "/", HelloWeb do
pipe_through :browser
get "/", PageController, :index
get "/test", PageController, :test
end
で、test
なアクションも追加。
def test(conn, _params) do
render(conn, "test.html")
end
どのコントローラとアクションがリクエストを処理しているかを示す関数を作成、とのこと。そのために web.ex
の import を修正、とあります。
# Import convenience functions from controllers
import Phoenix.Controller, only: [get_csrf_token: 0, get_flash: 2, view_module: 1, action_name: 1, controller_module: 1]
こうなのかどうか。で、web/views/page_view.ex
に action_name/1
と controller_module/1
を使う handler_info/1
を定義、connection_keys/1
も定義、とのこと。
defmodule Hello.HelloView do
use Hello.Web, :view
def handler_info(conn) do
"Request Handled By: #{controller_module(conn)}.#{action_name(conn)}"
end
def connection_keys(conn) do
conn
|> Map.from_struct()
|> Map.keys()
end
end
最後にテンプレートを追加。(web/templates/page/test.html.eex
)
<div class="phx-hero">
<p><%= handler_info(@conn) %></p>
</div>
View に手続き定義しとけば呼び出せるのか。これは page なソレの中でのみ有効みたいですが、ヘルパーてきなナニにしようと思ったらどうすりゃいいのかな。
Displaying Lists
connection_keys/1
という手続きを定義して conn からキーのリストが取得できる。これを表示するにはどうすれば良いか、ということで test.html.eex
を以下のように修正、とのこと。
<div class="phx-hero">
<p><%= handler_info(@conn) %></p>
<h3>Keys for the conn Struct</h3>
<%= for key <- connection_keys(@conn) do %>
<p><%= key %></p>
<% end %>
</div>
Render templates within templates
テンプレートは入れ子? にできる模様。key.html.eex
を新規に作成して
<p><%= key %></p>
test.html.eex
を以下のように、とのこと。
<%= for key <- connection_keys(@conn) do %>
<%= render("key.html", key: key) %>
<% end %>
Shared Templates Across Views
テンプレートを共有したい場合には共有ディレクトリを作れば良いらしい。あと、上では省略した書き方していたけれど、明示的に書くと以下な書き方ができる模様。
<%= for key <- connection_keys(@conn) do %>
<%= render(HelloWeb.PageView, "key.html", key: key) %>
<% end %>
この方式を使って共有なソレを作ってそこに置き、上記な呼び出しで render できるのか。とりあえず
web/templates/shared
を作成web/views/shared_view.ex
を作成key.html.eex
を shared に移動
で、以下な形で呼び出せば良い、となるのか。
<%= for key <- connection_keys(@conn) do %>
<%= render(HelloWeb.SharedView, "key.html", key: key) %>
<% end %>
成程。次は Channels の予定。