5.2 レイアウト・テンプレート・パーシャル
アプリ全体の共通レイアウトを定義する
デフォルト何も指定しない場合はapp/views/layouts/application.html.erb
がレイアウトとして適応されます。
特定のコントローラーなどでレイアウトを変更したい場合はlayout
メソッドを使います。
class PostsController < ApplicationController
layout 'admin'
def new
@post = Post.new
end
end
上記の例だとadmin
というレイアウトが呼ばれます。
フォーマット指定をする
respond_to
メソッドを使ってフォーマットを指定することができます。これによりフォーマットごとのテンプレートが呼ばれます。
class PostsController < ApplicationController
def index
@posts = Post.all
respond_to do |format|
format.html
format.xml { render xml: @posts }
format.json { render json: @posts }
end
end
end
フォーマットとして指定できる形式は以下になります。
フォーマット | |
---|---|
html | HTML |
xml | XML |
json | JSON |
rss | RSS |
atom | ATOM |
yaml | YAML |
text | TEXT |
js | JavaScript |
css | CSS |
cvs | CVS |
ics | ICS |
パーシャルでよく使う部分を再利用する
パーシャルを使うことでよく使うビューのパーツを切り出し、再利用することができます。
パーシャルのファイル名は名前の最初に_
がつきます。
app/views/shared/_title.html.erb
<h1>RailsCookBook<h1>
上のパーシャルはh1
タグを出力するパーシャルです。これを出力したいときは、ビューの中でrender
メソッドを使います。
引数にはファイルのパスを指定します。
<%= render 'shared/title' %>
パーシャルに変数を渡す
パーシャルの内部では変数を利用することも可能です。パーシャルを呼び出す時に変数の値を指定します。
app/views/shared/_title.html.erb
<h1><%= lang %>CookBook<h1>
上の例ではパーシャル内にlang
という変数を定義しました。これに値を入れるには呼び出し時に、以下のようにします。
<%= render 'shared/title', lang: 'Python' %>
変数の名前をキーに代入する値をハッシュの値にしてrender
メソッドの引数にします。
コレクションを表示する
配列などでeach
をしてその都度パーシャルを読み込むとパフォーマンスがよくありません。
パーシャルには配列を一括で描画する機能があります。
app/views/shared/_title.html.erb
<h1><%= lang %>CookBook<h1>
上のパーシャルで複数の言語を一括で描画したい時、以下のようになります。
<%= render partial: 'shared/title', collection: ['Python', 'PHP', 'Go'], as: :lang %>