Domanda

Voglio stampare alcuni oggetti in una tabella di avere 2 righe per oggetto, in questo modo:

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

ho scritto un helper nella products_helper.rb, in base alla risposta di questa domanda .

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

Ma questo non funziona come previsto. Esso restituisce solo l'ultimo nodo - l'ultimo <td>123</td>

Cosa devo fare per farlo funzionare?

È stato utile?

Soluzione

Ricordate i rendimenti funzione content_tag una stringa. Non scrivere direttamente alla pagina. Allora, cosa si sta facendo con il TD è questo:

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

Il che, se valutiamo questa parte sarebbe

content_tag :tr do
  "<td title='Ducks'> <a ...>Ducks</a></td>"
  "<td>19</td>"
end

E in un blocco, l'ultimo valore è quello che viene restituito. Ci sono due stringhe presenti, ma il primo appena si perde nell'etere. La seconda stringa è l'ultimo valore nel blocco e viene restituito.

Quello che dovete fare è inserire un + tra di loro per aggiungere le stringhe:

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

Si deve fare lo stesso a livello di TR, basta mettere un plus in là dopo la fine del primo content_tag.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top