2010-10-05 5 views
17

I fonction définie dans aide de l'application:rails, Comment construire une table dans helper en utilisant content_tag?

def display_standard_table(columns, collection = {})  
    content_tag :table do  
    concat content_tag :thead do 
     content_tag :tr do 
     concat columns.collect { |column| content_tag(:td, column[:display_name]) } 
     end 
    end  

    concat content_tag :tbody do 
     collection.collect { |elem| 
     concat content_tag(:tr, columns.collect { |column| 
      content_tag(:td, elem.attributes[column[:name]]) 
     }) 
    } 
    end 
    end 
end 

et je l'appelle à mon avis:

<%= display_standard_table(
      [ 
      { :name => 'id', :display_name => 'Id' }, 
      { :name => 'login', :display_name => 'Login' }, 
      { :name => 'first_name', :display_name => 'Name' }, 
      { :name => 'last_name', :display_name => 'LastName' }, 
      { :name => 'email', :display_name => 'Email'} 
      ], @users) %> 

La sortie en html est:

<table><thead></thead><tbody></tbody></table> 

et il devrait être:

<table><thead><tr><td>Id</td><td>Login</td>...</tr></thead><tbody><tr>row here</tr></tbody></table> 

et je ne peux pas comprendre ce qui manque. (. BTW J'utilise rails3)

[EDIT]

def display_standard_table(columns, collection = {})  
    content_tag(:table) do 
    concat(content_tag(:thead) do 
     concat(content_tag(:tr) do 
     concat(columns.collect { |column| content_tag(:td, column[:display_name]) }) 
     end) 
    end) 

    concat(content_tag(:tbody) do 
     concat(collection.collect { |elem| 
     content_tag(:tr, columns.collect { |column| 
      content_tag(:td, elem.attributes[column[:name]]) 
     }) 
     }) 
    end) 
    end 
end 

La version ci-dessus fonctionne bien, mais html généré est échappé:/selon les chaînes de la documentation produite par content_tag devrait être html_safe, mais ils sont échappé:/

Répondre

0

Il est le manquantconcat dans votre :tr lié content_tag.

Mise à jour

Quant à l'Évasion, un coup d'oeil à la api docs for content_tag. Vous devez spécifier de ne pas y échapper. Bien sûr, vous seriez responsable d'échapper les choses à l'intérieur des balises que vous voulez échapper dans ce cas.

+0

quand je supprimer concat tout cela me donne ceci:

5

En fait, il vous manque seulement plus entre les balises de contenu, vous pouvez trouver une question similaire ici

Rails- nested content_tag Le problème avec ceci, c'est peut-être que vous obtiendrez une erreur de syntaxe à cause de la façon dont vous utilisez les blocs, si vous utilisez un "{}" au lieu de "faire fin", vous allez être OK.

Ici (Change to the way the block is handled) vous pouvez trouver un exemple et une solution de contournement dans le cas où vous utilisez Rails 3 car Rails 3 ignore apparemment le résultat de l'instruction collect à l'intérieur de la balise content.

+0

Nice et simple, merci! –

27
def display_standard_table(columns, collection = {}) 

thead = content_tag :thead do 
    content_tag :tr do 
    columns.collect {|column| concat content_tag(:th,column[:display_name])}.join().html_safe 
    end 
end 

tbody = content_tag :tbody do 
    collection.collect { |elem| 
    content_tag :tr do 
     columns.collect { |column| 
      concat content_tag(:td, elem.attributes[column[:name]]) 
     }.to_s.html_safe 
    end 

    }.join().html_safe 
end 

content_tag :table, thead.concat(tbody) 

end 
0

Ajout de '.join(). Html_safe' à la fin de chaque section de collecte. C'est ce qui a fonctionné pour moi.

collection.collect { |elem| 
    concat content_tag(:tr, columns.collect { |column| 
     content_tag(:td, elem.attributes[column[:name]]) 
    }) 
}.join().html_safe 
Questions connexes