6
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Phoenixガイドラインを読んでみた(6) - View -

Last updated at Posted at 2016-04-26

はじめに

前回は、Controllerを見てきました。
今回はViewです。
次回は、ガイドラインのTemplateです。

視界

PhoenixのViewの主な仕事は二つです。重要な方の仕事は、Template(およびLayout)をレンダリングすること。これを行うのは、Phoenix.Viewに定義されたrender/3関数です。もう一つの仕事は、データを取得したりテンプレートにデータを加工する関数を提供することです。

Phoenixは、Controller、View、テンプレートとの間には絶対的な命名規則があり、PageControllerに対してはPageViewが必要であり、Templateはweb/templates/pageディレクトリにある必要があります。

ただし、もし必要であれば、Templateのルートディレクトリは変更することができます。web/web.exに定義されているHelloPhoenix.Webモジュールのview/0関数で、:rootキーの値を変更することでルートディレクトリを変更することができます。

Phoenixアプリケーションを生成したときには、三つのViewモジュールが生成されます。ErrorViewLayoutViewPageViewの三つで、すべて、web/viewsディレクトリにあります。

LayoutViewは、以下のようになっています。非常にシンプルです。

defmodule HelloPhoenix.LayoutView do
  use HelloPhoenix.Web, :view
end

HelloPhoenix.Web, :viewは、マクロによってHelloPhoenix.Webview/0関数を呼び出します。ここでルートディレクトリを:rootとしてセットしています。

ここで、レイアウトファイルtemplates/layout/app.html.eexの中の<title>Hello Phoenix</title><title><%= title %></title>に変更してみます。
次にLayoutViewに関数title/0を追加します。

defmodule HelloPhoenix.LayoutView do
  use HelloPhoenix.Web, :view

  def title do
    "Hogehoge"
  end
end

ここでサーバを起動してアクセスしてみると、タイトルに"Hogehoge"が表示されます。なお、title関数を実装していない場合には、サーバ起動前にコンパイルエラーが発生します。

Viewについてもう少し

Phoenix.Viewモジュールは、内部でuse Phoenix.Templateを呼び出すことでTemplateに関するさまざまな関数などを使用できるようにしています。

ここで新たな例として、PageView (web/views/page_view.ex)を下のように変更します。

defmodule HelloPhoenix.PageView do
  use HelloPhoenix.Web, :view

  def message do
    "Viewからのメッセージ"
  end
end

次にテンプレート(web/templates/page/test.html.eex)を作成します。

@付きのメッセージ: <%= @message %>
@なしのメッセージ: <%= message %>

今回はブラウザから見るのではなく、直接iexからrender関数を呼び出すことにします。

$ iex -S mix
iex(1) Phoenix.View.render(HelloPhoenix.PageView, "test.html", message: "Renderからのメッセージ")

{:safe,
 [[[["" | "@付きのメッセージ: "] | "Renderからのメッセージ"] |
    "\n@なしのメッセージ: "] | "Viewからのメッセージ"]}

結果tupleの最初の:safeatomは、結果の文字列がレンダリング可能な状態になっていることを示しています。
@付きのシンボルは、render/3の第三引数として与えられたMapから展開されます。@無しのシンボルはElixirコードとして解釈されます。

Layoutについて

LayoutはTemplateの一種です。したがって、Template同様にView(web/views/layout_view.ex)を持ちます。 Templateが描画されたとき、LayoutのViewは、@innerに表示されたTemplateの内容が格納されます。この内容は、常に":safe"とされたものです。 また、Layout用のTemplate(web/templates/layout/app.html.eex`では、

内に以下の記述があります。
ここに、Templateが展開されることになります。
<%= render @view_module, @view_template, assigns %>

Error View

Phoenixには、ErrorView(/web/views/error_view.ex)と呼ばれるViewがあります。このViewの目的は、一般的な二つのエラー、404と500の表示を行うことです。

defmodule HelloPhoenix.ErrorView do
  use HelloPhoenix.Web, :view

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

  def render("500.html", _assigns) do
    "Server internal error"
  end

  # In case no render clause matches or no
  # template is found, let's render it as 500
  def template_not_found(_template, assigns) do
    render "500.html", assigns
  end
end

エラーが発生したとき、開発環境ではいろいろエラー情報が表示されますが、製品環境ではエラー情報を表示しないようにしなければなりません。これを制御するのが、config/dev.exsにあるdebug_errors: falseです。

use Mix.Config

config :hello_phoenix, HelloPhoenix.Endpoint,
  http: [port: 4000],
  debug_errors: false,
  code_reloader: true,
  . . .

エラー表示にTemplateを使う場合は、web/templates/errorディレクトリを使いますが、デフォルトでは作成されません。必要なら手動で作成します。

6
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?