【问题标题】:How do you pass local variables to a content_tag or content_for?如何将局部变量传递给 content_tag 或 content_for?
【发布时间】:2013-06-28 05:49:34
【问题描述】:

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

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

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

【问题讨论】:

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


    【解决方案1】:

    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 之外。

    虽然我不确定您如何准确地使 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 %>
    

    请注意,您需要使用&lt;%= %&gt; 输出content_tag。如果没有输出,Rails 无法对解释的 content_tag 执行任何操作。

    【讨论】:

    • 我没有产品列表,这是一个不好的例子。查看我的编辑。
    • 谢谢。我想视图辅助函数是要走的路。有没有办法直接在视图中定义函数?
    • 我从未见过它完成,即使那样,我也无法想象如何完成它。不过,视图助手在这种情况下工作得很好,因为它从视图中提取函数的逻辑 away(它确实不应该在的地方)并 into 一个单独的层。
    • 如果您发现此答案有用(正如其他用户显然有的那样),您会考虑接受它是正确的吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多