tag rails content_tag ruby-on-rails ruby-on-rails-3

ruby-on-rails - content_tag - rails label tag



rieles, ¿Cómo construir una tabla en helper usando content_tag? (5)

Definí la función en la aplicación de ayuda:

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 lo llamo 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 debería 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. Estoy usando rieles 3)

[EDITAR]

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 html generado se escapa: / de acuerdo con las cadenas de documentación producidas por content_tag debe ser html_safe, pero se escapa: /


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


En realidad, solo le falta una ventaja entre las etiquetas de contenido, puede encontrar una pregunta similar aquí

Rails- contenido anidado_tag

El problema con esto, es que tal vez obtendrá un error de sintaxis debido a la forma en que está utilizando los bloques, si utiliza un "{}" en lugar de las declaraciones de "finalización", estará bien.

Aquí ( Cambie la forma en que se maneja el bloqueo ) puede encontrar un ejemplo y una solución en el caso de que use Rails 3 porque aparentemente Rails 3 ignora el resultado de la declaración de recopilación cuando está dentro de la etiqueta de contenido.


Es el concat falta en tu :tr related content_tag .

Actualizar

En cuanto al escape, eche un vistazo a los documentos api para content_tag . Necesitas especificar no escapar. Por supuesto, usted sería responsable de escapar de las cosas dentro de las etiquetas que desea que se escapen en ese caso.



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