Pregunta

Estoy haciendo mi mejor esfuerzo para construir un ayudante que da salida a una < 'ul> integrado por 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 la ABM miembros. Esto es bastante similar a lo que Rails salidas de andamiaje para la vista del índice.

Aquí está 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 producción exactamente lo que quieren. En primer lugar, si alguien piensa que hay una mejor manera de hacer esto, por favor no dude en corregirme, sospecho que estoy haciendo esto de una manera ackwards bajo, pero por el momento es la única forma que conozco.

Entonces trató 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 hay nada del código dentro de la salida div.links-bar a la vista. Estoy seguro de que esto debe tener algo que ver con el bloque y los enlaces, pero para la vida de mí que puedo averiguar qué o cómo hacer para solucionarlo. Nadie puede ofrecer alguna ayuda?

¿Fue útil?

Solución

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 de manera explícita en lugar de pasar en un símbolo para crear una colección de lo que no siempre es necesario para mostrar todos los registros de una tabla en particular a la vez. Se podría añadir paginación, etc.

Otros consejos

@ Joe , Puede seguir utilizando el método de display_all(collection_sym) Solo usa: return html.html_safe en lugar de: return html

Me sigue pareciendo que en muchas situaciones, es mejor para generar código HTML de ayudantes, en lugar de utilizar los parciales. Por lo tanto la función html_safe en Los carriles 3 se asegurará de que usted genera HTML, en lugar de convertirlo en String.

Como @TheDelChop dice, se necesita un concat para la content_tag interior, 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í: anidamiento content_tag en Rails 3

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top