2011-06-01 22 views
5

Actualmente estoy usando:Renderizar: ¿envolver la colección cada elemento?

<% @items.each do |item| %> 
    <li class="list-item"> 
    <%= render :partial => '/widgets/vertical_widget', 
       :object => item %> 
    </li> 
<% end %> 

para hacer unos 20 elementos de una página (también hay otro 20 de un widget diferente en la misma página).

Cuando miro los registros de mi servidor, se muestran ~ 400ms por widget de renderizado, lo que da un total de ~ 20k ms para la página. De lo que he leído usando: colletion en lugar de un bucle con: object debería ayudar a mejorar esos tiempos, sin embargo, no estoy seguro de cómo puedo ajustar cada instancia del widget en un LI si utilizo: collection. Nunca colocar el widget que se usa en el sitio está en una lista, por lo que no tiene sentido incluir el LI en el código del widget.

Podría incluir el código del widget directamente en el bucle en lugar de en un parcial, pero no quiero tener que realizar actualizaciones de código en varios lugares.

¡Se agradecerán cualquier otra idea para mejorar el rendimiento!

Respuesta

3

Dale una oportunidad content_tag:

#some_file.html.erb 

<ul> 
<%= render :partial => 'widgets/vertical_widget', 
      :collection => @items, 
      :locals => { :wrap_in => :li } %> 
</ul> 



#/widgets/vertical_widget.html.erb 

#First, render and capture the content once. 
<% @rendered_content = capture do %> 
    #render the item here 
<% end %> 

#Next, decide if the content rendered above should be wrapped in a tag or not 
#If the "wrap_in" variable was passed-in and it is not nil/empty, then use that 
#value for the tag; else do not wrap the content in a tag 
<% if defined?(wrap_in) && !wrap_in.blank? %> 
    <%= content_tag wrap_in do %> 
    <%= @rendered_content %> 
    <% end %> 
<% else %> 
    <%= @rendered_content %> 
<% end %> 
+0

Esperaba algo fuera del parcial, pero creo que esto resolverá mi problema. ¡Lo probaré cuando llegue a casa del trabajo! –

+0

Bueno, usted * podría * hacerlo usando una plantilla espaciadora (': spacer => 'some_spacer_template_file'') donde podría renderizar etiquetas" abiertas "(la plantilla sería'

  • '- tenga en cuenta las etiquetas" invertidas ") y a continuación, agregue un '
  • ' y agregue un '
  • ' en la llamada de renderizado de colección, pero eso es "incorrecto" y feo, y podría (?) causar otros problemas en el futuro. – Zabba

    +0

    Tu código funcionó muy bien, desafortunadamente mis problemas de lentitud persisten. ¡Gracias de cualquier manera! –

    2

    Comprendo que esto es una respuesta tardía pero puede ser útil para las personas con preguntas similares.

    La respuesta de Zabba es muy buena y debería ayudarnos como una guía general. Sin embargo, su problema de lentitud probablemente no tenga que ver con la representación. Si una sola renderización tarda 400ms, entonces es probable que esté golpeando la base de datos repetidamente dentro del parcial 'vertical_widget'. Verifique sus registros para saber qué consultas están en curso y vea si puede almacenarlas en caché utilizando una variable local.

    Cuestiones relacionadas