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
|