2010-10-05 13 views
17

que define la función de ayudante de aplicación:rails, ¿Cómo compilar la tabla en helper usando 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 

y me llaman en mi opinión:

<%= 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 salida en html es:

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

y que debe ser:

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

y no puedo entender lo que falta. (. Por cierto que estoy usando 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 versión anterior funciona bien, pero genera HTML se:/de conformidad con las cadenas de documentación producidos por content_tag debe ser html_safe, pero son escapó:/

Respuesta

0

es la falta concat en su :tr relacionados content_tag.

actualización

En cuanto al escape, echar un vistazo a la api docs for content_tag. Debe especificar que no debe escapar. Por supuesto, usted sería responsable de escapar de las cosas dentro de las etiquetas que desea que escaparan en ese caso.

+0

cuando quito concat en todo lo que me da esto:

5

En realidad sólo se echa en falta un plus entre etiquetas de contenido, se puede encontrar una pregunta similar aquí

Rails- nested content_tag

El problema con esto es que tal vez obtendrás un error de sintaxis debido a la forma en que estás usando los bloques, si usas una instrucción "{}" en lugar de "do end", estarás bien.

Aquí (Change to the way the block is handled) puede encontrar un ejemplo y una solución en el caso de que utilice Rails 3 porque aparentemente Rails 3 ignora el resultado de la instrucción de recopilación cuando está dentro de la etiqueta de contenido.

+0

bonito y sencillo, gracias! –

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

Agregando '.join(). Html_safe' al final de cada sección de recopilación. Eso es lo que funcionó para mí.

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