11
votes

Générez une table HTML à partir d'un tableau de hachage en rubis

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>


0 commentaires

6 Réponses :


3
votes

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 : < pré> xxx

sortie: xxx

é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.

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 :)


1 commentaires

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.



4
votes

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/>"


1 commentaires

C'est nous publier la même solution en même temps :-)



10
votes

Utilisez le xmlbuilder pour ceci: xxx

sortie xxx


1 commentaires

Cet exemple de script fournit des câbles avec une version actuelle de Ruby and Builder vers la sortie suivante: $ Ruby Test.rb

COL1 < tr> v1 v2
v3 v4 < 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: xxx


0 commentaires