1

次のように、オブジェクトごとに2行のテーブルにいくつかのオブジェクトを印刷したい:

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

この質問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>

機能させるにはどうすればよいですか?

4

1 に答える 1

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

そして、ブロック内で、最後の値が返される値です。2つのストリングが存在しますが、最初のストリングはエーテルで失われます。2番目の文字列はブロックの最後の値であり、返されます。

あなたがする必要があるのは、それらの間に+を置いて、文字列を一緒に追加することです:

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の終了後にプラスを入れてください。

于 2010-04-13T20:42:10.103 に答える