2011-06-01 60 views
5

目前我使用:渲染:收集包装每个项目?

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

呈现在页面上大约20个项目(有也是同一页面上的其他部件的另外20)。

当我查看我的服务器日志时,它显示每个窗口小部件呈现大约400毫秒,总计大约为20k毫秒的页面。从我读过的使用:colletion而不是循环with:object应该有助于改进这些时间,但是我不确定如果我使用:collection,如何将小部件的每个实例包装在LI中。从来没有放置在网站上使用的小部件是在列表中,因此将小部件代码包含在LI中是没有意义的。

我可以将小部件代码直接包含在循环中而不是部分中,但是我不想在多个地方进行代码更新。

任何其他想法,以提高性能将不胜感激!

回答

3

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

我曾经希望得到局部以外的东西,但我认为这仍然可以解决我的问题。下班回家时我会试一试! – 2011-06-01 20:27:18

+0

那么,你可以*使用间隔模板(':spacer =>'some_spacer_template_file'')来渲染“open”标签(模板应该是'

  • ' - 注意“反向”标签)然后在集合呈现调用中添加一个'
  • '并追加一个'
  • ' - 但这是“错误的”,并且可能会导致其他问题。 – Zabba 2011-06-01 20:35:05

    +0

    您的代码运行良好,不幸的是我的缓慢问题依然存在。不管怎么说,还是要谢谢你! – 2011-06-02 04:17:12

    2

    我意识到这是一个迟到的答案,但它可能是有用的人有类似的问题。

    Zabba的回答非常好,应该作为一般指导原则。但是,您的缓慢问题可能与渲染无关。如果单个渲染需要400ms,那么很可能您在“vertical_widget”部分内重复地访问了数据库。检查你的日志中发生了什么查询,看看你是否可以缓存任何使用本地变量的查询。