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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top