Frage

Ich möchte einige Objekte in einer Tabelle drucken, mit 2 Zeilen pro Objekt, wie folgt aus:

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

Ich schrieb eine Hilfsmethode in products_helper.rb, basierend auf der Antwort von diese Frage .

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

Aber das funktioniert nicht wie erwartet. Es gibt nur den letzten Knoten - die letzten <td>123</td>

Was soll ich tun, es funktioniert?

War es hilfreich?

Lösung

Denken Sie daran, die Funktion content_tag gibt einen String zurück. Es schreibt nicht direkt auf die Seite. Also, was Sie mit dem TDs tun, ist dies:

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

Welche wenn wir bewerten würde dies teilweise sein

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

Und in einem Block, der letzte Wert ist derjenige, der zurückgegeben wird. Es gibt zwei Saiten vorhanden, aber die erste wird im Äther nur verloren. Die zweite Zeichenfolge ist der letzte Wert in dem Block und zurückgegeben wird.

Was Sie tun müssen, ist Platz ein + zwischen ihnen die Saiten hinzuzufügen zusammen:

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

Sie müssen das gleiche auf der TR-Ebene tun, legen sie lediglich ein Plus dort nach dem Ende des ersten content_tag.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top