Ruby on rails 为什么我们需要传递:object到partials?

Ruby on rails 为什么我们需要传递:object到partials?,ruby-on-rails,Ruby On Rails,我有一个模型类别有很多:子类别 我正在使用代码根据使用Ajax的视图中的类别值下拉列表填充子类别值下拉列表。代码如下: _form.html.erb <%= f.select :category_id, @categories, {}, :tab_index => 4, :onchange => "#{remote_function(:url => {:action => "populate_subcategories"},

我有一个模型类别有很多:子类别

我正在使用代码根据使用Ajax的视图中的类别值下拉列表填充子类别值下拉列表。代码如下:

_form.html.erb

<%= f.select :category_id, @categories, {}, :tab_index => 4, :onchange => "#{remote_function(:url  => {:action => "populate_subcategories"},
                                                   :with => "'category_id='+value")}" %>
<div id = "subcategories_div">
  <%= render :partial => "subcategories", :object => @subcategories %>
</div>
<div id = "subcategories_div">
  <%= render :partial => "subcategories" %>
</div>
最后是_subcategories.html.erb

<%= f.select :subcategory_id, subcategories, {}, :tab_index => 5 %>
<%= f.select :subcategory_id, @subcategories, {}, :tab_index => 5 %>
使用@subcategories作为实例变量,以便它在局部视图中可用,就像Rails中的普通视图一样

也在_subcategories.html.erb中

<%= f.select :subcategory_id, subcategories, {}, :tab_index => 5 %>
<%= f.select :subcategory_id, @subcategories, {}, :tab_index => 5 %>
5%>
和_form.html.erb

<%= f.select :category_id, @categories, {}, :tab_index => 4, :onchange => "#{remote_function(:url  => {:action => "populate_subcategories"},
                                                   :with => "'category_id='+value")}" %>
<div id = "subcategories_div">
  <%= render :partial => "subcategories", :object => @subcategories %>
</div>
<div id = "subcategories_div">
  <%= render :partial => "subcategories" %>
</div>

“子类别”%>

为什么第一种方法优于第二种方法?是不是因为我们只有一个变量可以传递给部分变量?第一种方法的性能有什么改进吗?

原因是您希望部分代码独立于视图。通过使用@subcategories,可以在局部视图和视图之间创建不必要的依赖关系。这意味着要再次使用同一部分,必须确保定义了@subcategories,但情况可能并非如此。例如,您可能只定义了@my_子类别或@filtered_子类别。更糟糕的是,您可能有@subcategories和@filtered_子类别,并且您可能希望使用相同的分部显示这两个子类别。在这种情况下,最好能够将子类别传递给分部,而不是依赖于正在设置的实例变量。这样,您的部分就真正模块化了,并且符合面向对象的封装原则

例如:

<h1><%= My Subcategories %></h1>
render :partial => 'subcatgories', :object => @my_subcategories
<h1><%= Other Subcategories %></h1>
render :partial => 'subcatgories', :object => @other_subcategories

render:partial=>'subcatgaries',:object=>@my_subcategories
render:partial=>'子类别',:object=>@其他_子类别

您可以用partials优雅地命名您的IVAR

render 'subcatgories', :subcategories => @hashtags

然后你可以在你的部分中使用
子类别
,使用ivar就像它的名字假装的那样

去看看

有更长的参数形式来实现相同的行为。。。(
:partial=>'subcatgories',:locals=>{:subcategories=>@hashtags}

我相信
:subcategories=>@hashtags
:object=>@hashtags

@pan>具有更好的可读性。你能看看这个吗。。