#部分テンプレートを使う
View内で共通パーツ、繰り返し処理をするパーツは部分テンプレートを使います。
以下、説明の中の例ではArticleモデルがあって、titleというカラムを持つものとして説明します。
##基本形
partialに指定したテンプレートを呼び出します。
テンプレート名の先頭には"_"を付けます。
<%= render :partial => "(template_name))" %>
###例
render部分で_article.html.erbを読み込みます。
<%= render :partial => "article" %>
<p>articleです</p>
##変数を渡す
基本形は単純にテンプレートの表示を行いましたが、部分テンプレートに変数を渡してみたいと思います。
<%= render :partial => "(template_name))", :locals => { (ローカル変数名): (渡す値) } %>
###例
render部分で_article.html.erbを読み込みます。
<%= render :partial => "article", :locals => { title: @article.title } %>
<p>articleのタイトルは<%= title %>です</p>
これで title部分で @article.titleが入ります。
###補足
以下でも表示は同様に実現出来ます。
インスタンス変数を直接部分テンプレート内で使用しています。
<%= render :partial => "article" %>
<p>articleのタイトルは<%= @article.title %>です</p>
しかし、
- 部分テンプレートで使う変数が不明確。
- 再利用性が低い
といった観点からよくない書き方となります。
詳しくは
Railsの部分テンプレートからインスタンス変数を参照するのはやめよう。
が参考になります。
##部分テンプレートを繰り返し表示する
「一つの記事項目をテンプレート化して、それを繰り返し表示することで一覧を表示する」ように部分テンプレートを繰り返し処理したい場合があります。
そのときに、便利な方法があります。
<%= render :partial => "(template_name))", :collection => (繰り返し表示させるためのインスタンス) %>
###例
render部分で_article.html.erbを読み込みます。
@articles
の要素の数だけ部分テンプレートが繰り返されます。
<%= render :partial => "article", :collection => @articles %>
<p>articleのタイトルは<%= article.title %>です</p>
ここで、ローカル変数は:partialで指定したものになります。(例のarticle)
ただし、ローカル変数を別の名前で使用したい場合はasオプションを使います。
<%= render :partial => "article", :collection => @articles, :as => "ele" %>
<p>articleのタイトルは<%= ele.title %>です</p>
##補足
localsとcollectionは併用出来ます。