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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top