2011-06-01 92 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」部分內重複地訪問了數據庫。檢查你的日誌中發生了什麼查詢,看看你是否可以緩存任何使用本地變量的查詢。