今日は
layout ⊃ template ⊃ partial
のうちの template ⊃ partial の関係を見ていきたいと思います。
ちなみに layout ⊃ template の関係を見たいひとは
こちらからどうぞ。
template ファイルの中で、render(:partial ... を使えば、画面表示の一部分(partial)を共通に使い回すことができます。
平たくいうと、template が partial を使い回すということです。
早速例をみてみましょう。
app/controller/galileo_controller.rb というコントローラに
class GalileoController < ApplicationController
def list_males
@my_males = Person.find_all_by_gender("m")
end
def list_females
@special_title = 'ドキっ!女だらけのドンドンヒャララドンヒャララ'
@my_females = Person.find_all_by_gender("f")
end
end
と定義されていて、app/views/galileo/list_males.rhtml テンプレートファイルと app/views/galileo/list_females.rhtml テンプレートファイルで、partial ファイルを共有することにします。
app/views/galileo/list_males.rhtml
男祭りじゃ<br />
<%= render(:partial => "people",
:object => @my_males)
%>
app/views/galileo/list_females.rhtml
女祭りよ<br />
<%= render(:partial => "people",
:object => @my_females,
:locals => { :sub_title => @special_title }) %>
どちらも :partial => "people" と指定しているので、people という名前の partial ファイルを読み込んできます。
じゃあ、partial ファイルはどこにどういう風に置いておくの?という疑問があると思いますが、それは、template ファイルと全く同じディレクトリの中です。
上の例ですと、app/views/galileo/ ディレクトリの中ということになりますね。
ただ注意するのは、ファイル名の一番最初に _ アンダースコアを付けます。
上の partial ファイル名は people という指定だったので、_people.rhtml となります。
例えば _people.rhtml ファイルの中身は、
<%= sub_title %>
<% people.each do |person| %>
<%= person.id %><br />
<% end %>
こんな感じになります。
上の template ファイルで render しているときの引数ですが、
:object には、partial ファイルの中で partial ファイル名と同じ名前の変数として参照できるオブジェクトを指定します。
:locals には、その他 partial ファイルに渡したい値を指定します。
上の例ですと、partial ファイル(_people.rhtml)で使っている変数 people の中身は、@my_males だったり @my_females だったりします。
その他、sub_title という変数も partial ファイルで使っていますが、こちらは女祭りのときだけ @special_title の中身が入っています。
男祭りの時は、何も値が入っていませんから、空文字が表示される、ということになります。
なかなか面白いですね。
【広告】
=begin
%>
複数行の
コメントアウト
<%= satoimo.wakewakame %>
<%
=end
%>