Problema con la devolución de valores de un método de ayuda en Rails
-
26-09-2019 - |
Pregunta
Quiero imprimir algunos objetos en una tabla que tiene 2 filas por objeto, como esto:
<tr class="title">
<td>Name</td><td>Price</td>
</tr>
<tr class="content">
<td>Content</td><td>123</td>
</tr>
Me escribió un método de ayuda en products_helper.rb
, basado en la respuesta de esta pregunta .
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
Pero esto no funciona como se esperaba. Sólo se devuelve el último nodo - el último <td>123</td>
¿Qué debo hacer para que funcione?
Solución
Recuerde que la función content_tag devuelve una cadena. No escribe directamente a la página. Así que lo que está haciendo con el TDS es la siguiente:
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
Lo que si evaluamos esta parte sería
content_tag :tr do
"<td title='Ducks'> <a ...>Ducks</a></td>"
"<td>19</td>"
end
Y en un bloque, el último valor es el que se devuelve. Hay dos cadenas presentes, pero el primero de ellos simplemente se pierde en el éter. La segunda cadena es el último valor en el bloque y se volvió.
Lo que hay que hacer es colocar a + entre ellos para agregar las cadenas juntas:
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
Se debe hacer lo mismo a nivel TR, sólo hay que poner un plus de allí después del final de la primera content_tag.