将content_tag 分配给一个变量(并随后打印该变量)似乎有点令人费解,特别是因为没有很好的方法将您的产品集合传递给它。
执行此操作的 DRYer 方法是遍历您的产品列表并将每个产品传递给您的 content_tag:
<% products.each do |product| %>
<%= content_tag :div, :class => "product-info" do %>
<h1><%= product.name %></h1>
<p><%= product.description %></p>
<% end %>
<% end %>
或者,您可以将此逻辑抽象为有效地产生相同结果的视图助手:
def product_info_div(products)
products.each do |product| %>
content_tag :div, :class => "product-info" do %>
content_tag :div, product.name
content_tag :p, product.description
end
end
end
在您看来,您可以通过以下方式调用它:
<%= product_info_div(@products) %>
虽然这不是部分文件,但它是另一个文件。然而,这也正是视图助手的本意。任何一个选项都可以让你的代码保持干燥和可读,同时准确地完成你想要的,IMO。
编辑:
您无需显式传递局部变量即可在content_tag 中使用它们——它们可以在content_tag 中使用,因为它们在content_tag 之外。
虽然我不确定您如何准确地使 title 和 description 发生变化,但您可以在分配值的 content_tag 声明之前进行并行分配直接到title 和description 局部变量:
<% title, description = 'title_1', 'description_1' %>
<%= content_tag :div do %>
<h1><%= title %></h1>
<p><%= description %></p>
# a bunch of other stuff
<% end %>
<% title, description = 'title_2', 'description_2' %>
<%= content_tag :div do %>
<h1><%= title %></h1>
<p><%= description %></p>
# a bunch of other stuff
<% end %>
请注意,您需要使用<%= %> 输出content_tag。如果没有输出,Rails 无法对解释的 content_tag 执行任何操作。