Rails 部分テンプレートの使い方

  • 89
    Like
  • 0
    Comment
More than 1 year has passed since last update.

部分テンプレートを使う

View内で共通パーツ、繰り返し処理をするパーツは部分テンプレートを使います。
以下、説明の中の例ではArticleモデルがあって、titleというカラムを持つものとして説明します。

基本形

partialに指定したテンプレートを呼び出します。
テンプレート名の先頭には"_"を付けます。

<%= render :partial => "(template_name))" %>

render部分で_article.html.erbを読み込みます。

articles/index.html.erb
<%= render :partial => "article" %>
articles/_article.html.erb
<p>articleです</p>

変数を渡す

基本形は単純にテンプレートの表示を行いましたが、部分テンプレートに変数を渡してみたいと思います。

<%= render :partial => "(template_name))", :locals => { (ローカル変数名): (渡す値) } %>

render部分で_article.html.erbを読み込みます。

articles/index.html.erb
<%= render :partial => "article", :locals => { title: @article.title } %>
articles/_article.html.erb
<p>articleのタイトルは<%= title %>です</p>

これで title部分で @article.titleが入ります。

補足

以下でも表示は同様に実現出来ます。
インスタンス変数を直接部分テンプレート内で使用しています。

articles/index.html.erb
<%= render :partial => "article" %>
articles/_article.html.erb
<p>articleのタイトルは<%= @article.title %>です</p>

しかし、

  • 部分テンプレートで使う変数が不明確。
  • 再利用性が低い

といった観点からよくない書き方となります。
詳しくは
Railsの部分テンプレートからインスタンス変数を参照するのはやめよう。
が参考になります。

部分テンプレートを繰り返し表示する

「一つの記事項目をテンプレート化して、それを繰り返し表示することで一覧を表示する」ように部分テンプレートを繰り返し処理したい場合があります。
そのときに、便利な方法があります。

<%= render :partial => "(template_name))", :collection => (繰り返し表示させるためのインスタンス) %>

render部分で_article.html.erbを読み込みます。
@articlesの要素の数だけ部分テンプレートが繰り返されます。

articles/index.html.erb
<%= render :partial => "article", :collection => @articles %>
articles/_article.html.erb
<p>articleのタイトルは<%= article.title %>です</p>

ここで、ローカル変数は:partialで指定したものになります。(例のarticle)
ただし、ローカル変数を別の名前で使用したい場合はasオプションを使います。

articles/index.html.erb
<%= render :partial => "article", :collection => @articles, :as => "ele" %>
articles/_article.html.erb
<p>articleのタイトルは<%= ele.title %>です</p>

補足

localsとcollectionは併用出来ます。