Визуализация: коллекция обернуть каждый элемент? - PullRequest
6 голосов
/ 01 июня 2011

В настоящее время я использую:

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

для отображения около 20 элементов на странице (есть также еще 20 различных виджетов на той же странице).

Когда я просматриваю логи моего сервера, он показывает ~ 400 мс на визуализацию виджета, что в сумме составляет ~ 20 000 мс для страницы. Из того, что я прочитал, используя: Collection вместо цикла с: object должно помочь улучшить эти времена, однако я не уверен, как я могу обернуть каждый экземпляр виджета в LI, если я использую: collection. Никогда не размещать виджет, используемый на сайте, находится в списке, поэтому нет смысла включать LI в код виджета.

Я мог бы включать код виджета непосредственно в цикл, а не в часть, однако я не хочу делать обновления кода в нескольких местах.

Буду признателен за любые другие идеи по улучшению производительности!

Ответы [ 2 ]

4 голосов
/ 01 июня 2011

Дайте 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 %>
2 голосов
/ 04 июня 2012

Я понимаю, что это поздний ответ, но он может быть полезен для людей с похожими вопросами.

Ответ Заббы очень хороший и должен помочь в качестве общего руководства.Однако ваша проблема с медлительностью, вероятно, не связана с рендерингом.Если один рендеринг занимает 400 мс, то, скорее всего, вы неоднократно обращаетесь к базе данных в части «vertical_widget».Проверьте в своих журналах, какие запросы выполняются, и посмотрите, можете ли вы кешировать что-либо из этого с помощью локальной переменной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...