29

Estoy haciendo todo lo posible para crear un helper que produzca un < 'ul> que conste de todos los miembros de una colección. Para cada miembro de la colección quiero imprimir un < 'li> que tiene un título y un div de enlaces a CRUD el miembro. Esto es bastante similar a los resultados de Rails para andamios para la vista de índice.Utilizando helpers en rieles 3 para generar html

Aquí es el ayudante 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 que la salida es exactamente lo que quiero. Antes que nada, si alguien piensa que hay una mejor manera de hacerlo, por favor siéntete libre de corregirme, sospecho que estoy haciendo esto en un bajo hacia atrás, pero por el momento es la única forma en que sé cómo hacerlo.

entonces trataron de 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 tiene alguno de los código dentro de la salida div.links-bar a la vista. Estoy seguro de que esto debe tener algo que ver con el bloqueo y las ataduras, pero durante toda la vida puedo descubrir qué o cómo solucionarlo. ¿Alguien puede ofrecer ayuda?

+3

Lo ¿Es tu primera intención usar ayudantes? ¿Por qué no hacer esto en plantilla en su lugar? –

+0

Hmmmm, supongo que podría usar una plantilla, no estoy seguro de por qué no pensé en eso. – TheDelChop

+1

parciales es el camino a seguir en esto, creo ... felicitaciones por hojear todo ese código ... me dolió la cabeza solo leyéndolo ;-) – Ryan

Respuesta

44

Estoy de acuerdo con el comentario anterior recomendar el uso de un parcial ... pero si tenía necesidad de hacer esto en un ayudante, esto 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 

me lo pase en una colección explícitamente en lugar de pasar un símbolo para crear una colección, por lo que no siempre se requiere mostrar TODOS los registros en una tabla en particular a la vez. Se podría añadir paginación, etc.

+0

Sí, estoy de acuerdo en que si tuviera que hacerlo de esta manera, esta es la mejor manera de hacerlo.Pero como dijeron los otros chicos, voy a usar un parcial. ¡Gracias! – TheDelChop

+4

¿No necesitas un concat para la etiqueta de contenido interna? –

24

@ Joe, Puede seguir utilizando el método de display_all(collection_sym) sólo tiene que utilizar: return html.html_safe en lugar de: return html

todavía me parece que en muchas situaciones, es es mejor generar HTML a partir de ayudantes, en lugar de usar parciales. Por lo tanto, la función html_safe en Rails 3 se asegurará de generar HTML, en lugar de convertirlo a String.

+0

Funcionó como un amuleto para mí, y es agradable y simple cuando solo necesito generar una o dos etiquetas del ayudante. –

2

Como dice @TheDelChop, se necesita un concat para el interior content_tag, de lo contrario la salida es sólo <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 explicación aquí: Nesting content_tag in Rails 3