ruby-on-rails - and - select rails helper
Usando ayudantes en los rieles 3 para producir html (3)
Estoy haciendo mi mejor esfuerzo para construir un ayudante que genere un <''ul> compuesto por todos los miembros de una colección. Para cada miembro de la colección, quiero imprimir un <''li> que tenga un título y una división de enlaces a CRUD el miembro. Esto es bastante similar a lo que Rails genera para los andamios de la vista de índice.
Aquí está el ayudante que tengo:
def display_all(collection_sym)
collection = collection_sym.to_s.capitalize.singularize.constantize.all
name = collection_sym.to_s.downcase
html = ''''
html << "<ul class=/"#{name}-list/">"
for member in collection do
html << content_tag(:li, :id => member.title.gsub('' '', ''-'').downcase.strip) do
concat content_tag(:h1, member.title, :class => "#{name}-title")
concat link_to ''Edit'', "/#{name}/#{member.id}/edit"
concat "/|"
concat link_to ''View'', "/#{name}/#{member.id}"
concat "/|"
concat button_to ''Delete'', "/#{name}/#{member.id}", :confirm => ''Are you sure? This cannot be undone.'', :method => :delete
end
end
html << ''</ul>''
return html
end
Y eso da exactamente lo que quiero. En primer lugar, si alguien piensa que hay una mejor manera de hacerlo, por favor siéntase libre de corregirme, sospecho que estoy haciendo esto en forma de bajos, pero en este momento es la única forma en que sé cómo.
Luego intenté envolver los enlaces en un div de la siguiente manera:
def display_all(collection_sym)
collection = collection_sym.to_s.capitalize.singularize.constantize.all
name = collection_sym.to_s.downcase
html = ''''
html << "<ul class=/"#{name}-list/">"
for member in collection do
html << content_tag(:li, :id => member.title.gsub('' '', ''-'').downcase.strip) do
concat content_tag(:h1, member.title, :class => "#{name}-title")
concat content_tag(:div, :class => "links-bar") do
concat link_to ''Edit'', "/#{name}/#{member.id}/edit"
concat "/|"
concat link_to ''View'', "/#{name}/#{member.id}"
concat "/|"
concat button_to ''Delete'', "/#{name}/#{member.id}", :confirm => ''Are you sure? This cannot be undone.'', :method => :delete
end
end
end
html << ''</ul>''
return html
end
Sin embargo, ahora ya no obtengo ninguna de las marcas dentro de la salida de div.links-bar en la vista. Estoy seguro de que esto debe tener algo que ver con el bloqueo y los enlaces, pero puedo, por mi vida, averiguar qué o cómo solucionarlo. ¿Alguien puede ofrecer alguna ayuda?
Como dice @TheDelChop, necesitas un concat
para el content_tag
interno, de lo contrario, la salida es solo <ul></ul>
Esto es lo que parece:
def display_all(collection)
content_tag(:ul, :class => "list") do
collection.collect do |member|
concat(
content_tag(:li, :id => member.name.gsub('' '', ''-'').downcase.strip) do
member.name
end
)
end
end
end
Más explicaciones aquí: Nesting content_tag en Rails 3
Estoy de acuerdo con el comentario anterior que recomienda el uso de un parcial ... pero si DID necesita hacer esto en un ayudante, esta es una forma más limpia de implementar:
def display_all(collection)
content_tag(:ul, class: "list") do
collection.collect do |member|
concat(content_tag(:li, id: member.name.gsub('' '', ''-'').downcase.strip) do
member.name
end)
end
end
end
Pasaría una colección explícitamente en lugar de pasar un símbolo para crear una colección, por lo que no siempre es necesario mostrar TODOS los registros en una tabla en particular a la vez. Podrías añadir paginación, etc.
@ Joe , todavía puedes usar tu método display_all(collection_sym)
Solo usa: return html.html_safe
lugar de: return html
Todavía encuentro que en muchas situaciones, es mejor generar HTML a partir de ayudantes, en lugar de usar parciales. Así que la función html_safe
en Rails 3 se asegurará de que genere HTML, en lugar de convertirlo en String
.