在Rails中从辅助方法返回值的问题

时间:2010-04-13 20:13:45

标签: ruby-on-rails return-value helpermethods

我想在每个对象有2行的表中打印一些对象,如下所示:

<tr class="title">
    <td>Name</td><td>Price</td>
</tr>
<tr class="content">
    <td>Content</td><td>123</td>
</tr>

我根据this question的答案在products_helper.rb中编写了一个帮助方法。

def write_products(products)
  products.map {
    |product|
    content_tag :tr, :class => "title" do
      content_tag :td do
        link_to h(product.name), product, :title=>product.name
      end
      content_tag :td do
        product.price
      end
    end
    content_tag :tr, :class => "content" do
      content_tag :td, h(product.content)
      content_tag :td, product.count
    end
  }.join
end

但这并不像预期的那样有效。它只返回最后一个节点 - 最后一个<td>123</td>

我该怎么做才能让它发挥作用?

1 个答案:

答案 0 :(得分:2)

记住函数content_tag返回一个字符串。它不直接写入页面。所以你在TD上做的是:

content_tag :tr do
  content_tag :td do
    link_to h(product.name), product, :title=>product.name
  end
  content_tag :td do
    product.price
  end
end

如果我们部分评估这将是

content_tag :tr do
  "<td title='Ducks'> <a ...>Ducks</a></td>"
  "<td>19</td>"
end

在一个块中,最后一个值是返回的值。存在两个字符串,但第一个字符串在以太中丢失。第二个字符串是块中的最后一个值并返回。

您需要做的是在它们之间放置一个+以将字符串添加到一起:

content_tag :tr do
  (content_tag(:td) do
    link_to h(product.name), product, :title=>product.name
  end) + #SEE THE PLUS IS ADDED HERE
  (content_tag(:td) do
    product.price
  end)
end

你必须在TR级别做同样的事情,在第一个content_tag结束后加上一个加号。