渲染部分:object vs:locals


72
<%= render :partial => 'partial/path', :locals => {:xyz => 'abc'} %>

<%= render :partial => 'partial/path', :object => @some_object %>

我认为第一个使局部变量xyz中的局部变量可用,第二个使局部变量object中的局部变量可用。那么区别是什么呢?(此外locals允许多个变量)

Answers:


36

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

您可以使用:as =>“ another_name”指定其他变量名。

此处记录了以下内容:http : //api.rubyonrails.org/classes/ActionView/PartialRenderer.html,此处:http : //apidock.com/rails/ActionView/PartialRenderer

...以及旧版Rails(版本<= v3.09):http ://apidock.com/rails/ActionView/Partials



57

第二种形式

render :partial => 'account', :object => @some_account

将确保accountPartial中的变量将设置为@some_account。您可以使用:as选项重命名变量。

的最大优点:locals

  • 您可以非常清楚地控制对象和名称
  • 您可以分配多个变量

所以你可以做类似的事情

render partial => 'some_view', :locals => { :user => account.user, :details => some_details_we_retrieved }

在需要时进行清晰的分隔。

这种:locals方法的缺点是它比较冗长,有时很简单

render :partial => 'account'

等同于

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

因此,请使用最适合您的一种(或最适合您的一种)。


我有一个示例,可以在我的局部对象中通过对象访问:object变量的名称。这很奇怪。
克里斯·穆恩奇

如果@account为nil,:object=>@account则不会在部分帐户中可用;尝试执行以下操作时会出现错误:if account <do something>。如果不确定是否已定义@account,请使用 :locals => { :account=>@account }
Fred Willmore

19

如果您使用的是Rails 3+,则可以使用更简单的语法:

# Instead of <%= render partial: "account", locals: { account: @buyer } %>
<%= render 'account', account: @buyer %>

来源:动作视图局部


6
仅供参考,如果您尝试从控制器渲染部分视图,则此简短格式将不起作用
约书亚·品特

4
当我阅读以上评论时,我问自己:“那么,控制器能做什么?” 冒着明显的风险,答案是包含locals:密钥的版本。
詹森·斯威特
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.