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í
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.
Vea el panorama sobre eso: http://railscasts.com/episodes/208-erb-blocks-in-rails-3 todo es cómo explica cómo administra su ayudante de bloque en los rieles 3
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