在partial中使用object,collection和locals之间的区别是什么

时间:2012-11-17 01:04:48

标签: ruby-on-rails

我很难理解

之间的区别
<%= render :partial => "book", :object => @book %>

<%= render :partial => "book", :collection => @books %>

<%= render :partial => "book", :locals => { :book => @book } %>

有人可以向我解释一下吗?

3 个答案:

答案 0 :(得分:3)

这些是相同的:

<%= render :partial => "book", :object => @book %>
<%= render :partial => "book", :locals => { :book => @book } %>
<%= render "book", :book => @book %>

他们将呈现_book.html.erb文件一次,@ book对象将作为book变量在该部分中可用。

这是一个简单的缩写相同的方法:

<%= render @book %>

这个有点不同:

<%= render :partial => "book", :collection => @books %>

它将在_book.html.erb中为每本书呈现@books个文件一次,每个文件在该部分中变为book变量。

这是一个简单的缩写相同的方法:

<%= render @books %>

答案 1 :(得分:1)

<%= render :partial => "book", :object => @book %>

将部分_book.html.erb设置为将局部变量book设置为@book

<%= render :partial => "book", :collection => @books %>

@books中的每个元素都会将部分_book.html.erb设置为book中的当前元素的局部变量@books

<%= render :partial => "book", :locals => { :book => @book } %>

将部分_book.html.erb设置为局部变量book为@book。此表单允许您设置其他局部变量或更改它们的名称,而:对象版本不会。

答案 2 :(得分:1)

<%= render :partial => "book", :object => @book %>

在第一种情况下使用:object将默认定义一个与partial相同的变量。如果我的部分模板名为_user.html.erb,则模板中将定义一个名为“user”的局部变量。

您可以使用以下命令指定其他变量名称:as =&gt; “another_name”。

<%= render :partial => "book", :locals => { :book => @book } %>

:locals的最大优势在于

  1. 您可以非常清楚地控制对象和名称
  2. 您可以指定多个变量
  3. :locals方法的缺点是它更冗长,有时候更简单

    render :partial => 'account'
    

    相同
    render :partial => 'account', :locals => {:account => @account }
    

    因此,请使用最适合您的(或最适合您的地方)。

    <%= render :partial => "book", :collection => @books %>
    

    For Collection请参阅:http://blogs.visoftinc.com/2010/04/27/ruby-beauty-rendering-a-rails-partial-for-a-collection/

    更多信息:http://guides.rubyonrails.org/layouts_and_rendering.html#using-partials