Programming Phoenix勉強その4

Programming Phoenix勉強その4

その4です。 その3の続きです。 :show アクションの実装からです.

:showアクションの実装

:show アクションで各ユーザの詳細を表示できるようにします. まず Controler を実装します.

def show(conn, %{"id" => id}) do
  user = Repo.get(Rumbl.User, id)
  render conn, "show.html", user: user
end

次に, web/templates/user/show.html.eex を以下の内容で実装します.

<h1>Showing User</h1>
<b><%= first_name(@user) %></b> (<%= @user.id %>)

よく見ると <b> タグの部分が index.html.eex とかぶっているのがわかります.

templateの分離

各テンプレートで重複している部分を別テンプレートに分離します. web/templates/user/user.html.eex を以下の内容で実装します.

<b><%= first_name(@user) %></b> (<%= @user.id %>)

共通部分をくくりだしたので,既存のテンプレートを編集します. web/templates/user/index.html.eex を以下の内容に変更します. <%= render "user.html", user: user %> の部分が変更点です.

<h1>Listing Users</h1>

<table class="table">
  <%= for user <- @users do %>
    <tr>
      <td><%= render "user.html", user: user %></td>
      <td><%= link "View", to: user_path(@conn, :show, user.id) %></td>
    </tr>
  <% end %>
</table>

web/templates/user/show.html.eex も同様に変更します.

<h1>Showing User</h1>
<%= render "user.html", user: @user %>

view はモジュール, template は関数と捉えると良いみたいです. iex -S mix で以下のコマンドを入力すると何が起きているかなんとなくわかります. view の部分が :safe とリストの入れ子のタプルになってて一見わかりにくいですが,リストの部分は単なるタグの入れ子になってるみたいです. 素のタグ部分と, <%= %> とか <% %> の部分とでわけられてるみたいです.

iex(1)> user = Rumbl.Repo.get Rumbl.User, "1"
%Rumbl.User{id: "1", name: "Jose", password: "elixir", username: "josevalim"}
iex(2)> view = Rumbl.UserView.render("user.html", user: user)
{:safe, [[[[["" | "<b>"] | "Jose"] | "</b> ("] | "1"] | ")\n"]}
iex(3)> Phoenix.HTML.safe_to_string(view)
"<b>Jose</b> (1)\n"

:safe はこのHTMLが安全であることを示しています. また、リストになっているのはパフォーマスのためだそうです. ぱっと見どのテンプレートも render 関数呼び出しで呼び出されるっぽいですがテンプレート名でパターンマッチが行われることによってレンダリングしてるようです. error 見るとよりわかりやすそうです.

def render("404.html", _assigns) do
  "Page not found"
end

def render("500.html", _assigns) do
  "Internal server error"
end

render 関数が2つあって第一引数のテンプレート名でパターンマッチしてるのがわかります.

レンダリングについて

一番初めに templates/layout/app.html.eex がレンダリングされて,その後正規のテンプレートがレンダリングされる. まぁRailsとかもおんなじ感じだったと思うのでここらへんは適当にすっ飛ばします.

まとめ

ここでChapter3終わるのでちょっと短いですがここまでです. ``@conn みたいな度々出てくる conn`` の正体がまだイマイチ理解しきれてないので具体的にどういうものがどういう流れで入ってきてるのかぼちぼちしらべたいです.