Quel est le meilleur moyen (idéalement un joyau, mais un extrait de code si nécessaire) pour générer une table HTML à partir d'un tableau de hachages?
Par exemple, ce tableau de hachage: P>
<table> <tr><th>col1</th><th>col2</th></tr> <tr><td>v1</td><td>v2</td></tr> <tr><td>v3</td><td>v4</td></tr> </table>
6 Réponses :
Cela ne semble pas particulièrement difficile à faire à la main. Selon l'endroit où vous allez l'utiliser, cela devrait probablement aller dans sa propre méthode quelque part, mais voici le petit script que je viens d'écrire:
table.rb strong>: p> < pré> xxx pré> évidemment, il y a des problèmes - pour un, il suppose que la rangée de ses rubriques sont les mêmes que tous les autres rubriques. Vous pouvez pré-traiter et travailler autour de cela assez facilement, cependant, en remplissant des nils dans toutes les lignes pour tous les titres non attribués correctement. P> La raison pour laquelle il n'y a pas de gemme n'est que générer une table n'est pas vraiment une énorme entreprise. C'est incroyable ce que vous pouvez faire lorsque vous vous bouclez et de coder quelque chose à vous-même :) p> p>
Je viens de remarquer que depuis que j'ai fini par changer le script, la sortie n'est certainement pas cela. Éditer en seulement une seconde.
Vous pouvez utiliser Builder code> :
require 'builder'
a = [{"col1"=>"v1", "col2"=>"v2"}, {"col1"=>"v3", "col2"=>"v4"}]
builder = Builder::XmlMarkup.new
columns = a.first.keys
builder.table do |t|
t.tr do |tr|
columns.each do |col|
tr.th(col)
end
end
a.each do |row|
t.tr do |tr|
columns.each do |col|
tr.td(row[col])
end
end
end
end
p builder.target
#=> "<table><tr><th>col1</th><th>col2</th></tr><tr><td>v1</td><td>v2</td></tr><tr><td>v3</td><td>v4</td></tr></table><target/>"
C'est nous publier la même solution en même temps :-)
Utilisez le xmlbuilder pour ceci:
Cet exemple de script fournit des câbles avec une version actuelle de Ruby and Builder vers la sortie suivante: $ Ruby Test.rb
| COL1 TH> TR> TR> < tr> | v1 td> | v2 td> tr> |
|---|---|---|
| v3 td> | v4 td> tr> table> < to_s /> Remplacez la partie METS avec ce qui suit et fonctionne: met "# {xm.target!}"
1
votes La réponse de Matchu m'a beaucoup inspiré et je l'ai modifiée à des méthodes auto-définies au lieu de changer la classe intégrée (ne le faisez pas à moins que vous n'ayez une raison vraiment bonne). En plus de générer une table, la structure de la matrice peut-être beaucoup plus pratique et intuitive pour accéder aux éléments d'accès. P> Laissez toute la table stockée dans un tableau 2-D, dites P> <table class="table">
<thead>
<tr><th>Name</th><th>Gender</th><th>Age</th></tr>
</thead>
<tbody>
<tr><td>Andy</td><td>M</td><td>20</td></tr>
<tr><td>Mary</td><td>F</td><td>19</td></tr>
<tr><td>Tony</td><td>M</td><td>18</td></tr>
</tbody>
</table>
0 commentaires
14
votes # modified from Harish's answer, to take care of sparse hashes:
require 'builder'
def hasharray_to_html( hashArray )
# collect all hash keys, even if they don't appear in each hash:
headers = hashArray.inject([]){|a,x| a |= x.keys ; a} # use array union to find all unique headers/keys
html = Builder::XmlMarkup.new(:indent => 2)
html.table {
html.tr { headers.each{|h| html.th(h)} }
hashArray.each do |row|
html.tr { row.values.each { |value| html.td(value) }}
end
}
return html
end
1 commentaires
Cette réponse est si sous-estimée.
1
votes the DOM GEM que j'ai développé a la fonctionnalité de ce que vous voulez faire. Vous pouvez créer une table comme celle-ci tous facilement dans le code rubis:
0 commentaires
|