如何将局部变量传递给content_tag或content_for?

时间:2013-06-28 05:49:35

标签: ruby-on-rails ruby content-for content-tag

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

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

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

1 个答案:

答案 0 :(得分: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。

编辑:

您不需要显式传递局部变量,以便在content_tag中使用它们 - 它们可以在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_tag输出<%= %>。如果没有输出,Rails对解释的content_tag不能做任何事情。