局部样板可以将Template中重复的程式码抽出来,例如我们在Part1中示范过的新增和编辑的表单。Partial Template的命名惯例是底线开头,但是呼叫时不需加上底线,例如:
<%= render :partial => "common/nav" %>
这样便会使用app/views/common/_nav.html.erb这个样板。如果使用Partial的样板和Partial所在的目录相同,可以省略第一段的common路径。
在Partial样板中是可以直接使用实例变数的(也就是@
开头的变数)。不过好的实务作法是透过:locals
明确传递区域变数,这样程式会比较清楚,Partial样板也比较容易被重复使用:
<%= render :partial => "common/nav", :locals => { :a => 1, :b => 2 } %>
这样在partial样板中,就可以存取到区域变数a
和b
。
如果是阵列的资料,一般直觉会这样写:
@items.each do |item|
render :partial => "item", :locals => { :item => item }
end
但是,partial可以支援处理阵列形式:
render :partial => "item", :collection => @items, :as => :item
这样的好处不只是少打字而已,还有效能上的好处,Rails会针对这种形式做最佳化。
像是tr
或li
这类会一直重复的Template元素,我们可以使用collection
参数来处理,Rails有针对集合型的Partial做效率最佳化,例如像以下的程式:
<ul> <% @people.each do |person| %>
<%= render :partial => "person", :locals => { :person => person } %>
<% end %>
<ul>
可以改使用Collection方式,
<ul>
<%= render :partial => "person", :collection => @people %>
<ul>
如此既可以少掉两行each
程式码,执行的效能又更好。