Problema con restituzione di valori da un metodo di supporto in Rails
-
26-09-2019 - |
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?
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.