LoginSignup
283
296

More than 5 years have passed since last update.

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

Last updated at Posted at 2015-07-12

部分テンプレートを使う

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は併用出来ます。

283
296
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
283
296