rails and ruby-on-rails ruby ruby-on-rails-3 html-helper actionviewhelper

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 .