0

在我看来,我有一个content_tag看起来像这样的:

<% content_tag :div do %>
    <h1><%= title %></h1>
    <p><%= description %></p>
    ... # a bunch of other stuff
<% end %>

我想content_tag多次使用它在页面上创建“部分”,每次传递一个不同的titledescription给它。但是,我不想去做一个局部的,这似乎有点矫枉过正。我希望所有内容都包含在一个视图文件中。我该怎么做?

4

1 回答 1

3

将 分配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。

编辑:

您无需显式传递局部变量即可在 a 中使用它们content_tag——它们可以在 a 中使用,content_tag因为它们在它之外。

虽然我不确定你是如何精确获取titledescription改变的,但你可以在声明之前直接进行并行赋值,在该content_tag声明中为titledescription局部变量赋值:

<% 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_tagusing <%= %>content_tag如果没有输出,Rails 不能对解释型做任何事情。

于 2013-06-28T06:20:01.773 回答