Problema de retornar valores de um método auxiliar em trilhos
-
26-09-2019 - |
Pergunta
Quero imprimir alguns objetos em uma tabela com 2 linhas por objeto, como este:
<tr class="title">
<td>Name</td><td>Price</td>
</tr>
<tr class="content">
<td>Content</td><td>123</td>
</tr>
Eu escrevi um método auxiliar em products_helper.rb
, com base na resposta de essa questão.
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
Mas isso não funciona como esperado. Ele só retorna o último nó - o último <td>123</td>
O que devo fazer para fazê -lo funcionar?
Solução
Lembre -se de que a função content_tag retorna uma string. Ele não escreve diretamente na página. Então, o que você está fazendo com os TDs é o seguinte:
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
Que se avaliarmos isso parcialmente seria
content_tag :tr do
"<td title='Ducks'> <a ...>Ducks</a></td>"
"<td>19</td>"
end
E em um bloco, o último valor é o que é retornado. Existem duas cordas presentes, mas a primeira apenas se perde no éter. A segunda sequência é o último valor no bloco e é devolvido.
O que você precisa fazer é colocar A + entre eles para adicionar as cordas:
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
Você deve fazer o mesmo no nível TR, basta colocar uma vantagem lá após o final do primeiro content_tag.