/var/log/messages

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

phoenix excersize (12)

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.exaction_name/1controller_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 の予定。

phoenix excersize (11) phoenix excersize (13)

comments powered by Disqus