,我有一个看起来像这样的content_tag
:
<% content_tag :div do %>
<h1><%= title %></h1>
<p><%= description %></p>
... # a bunch of other stuff
<% end %>
我想多次使用此content_tag
在页面上创建"部分",每次都传递不同的title
并description
。但是,我不想去做一个部分,这似乎有点矫枉过正。我希望所有内容都包含在一个视图文件中。我该怎么做?
将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
内使用,因为它们在之外。
虽然我不确定您如何准确地让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
。如果未输出解释content_tag
,则 Rails 无法对解释执行任何操作。