Rails有时会花费太多时间来渲染

时间:2013-01-11 18:21:40

标签: ruby-on-rails-3 ruby-on-rails-3.1 partial-views renderpartial

在我的观点中,我正在渲染一部分。这实际上是一个行元素,在表中显示大约500 - 600次。我渴望加载所有协会。 但是,问题是,相同的部分需要在某些时候突然改变渲染时间。

我的rails服务器o / p:

Rendered admin/invoices/_update.html.erb (1330.3ms)
Rendered admin/invoices/_update.html.erb (4.8ms)
Rendered admin/invoices/_update.html.erb (4.8ms)
Rendered admin/invoices/_update.html.erb (8.8ms)
Rendered admin/invoices/_update.html.erb (4.4ms)
Rendered admin/invoices/_update.html.erb (1309.9ms)
Rendered admin/invoices/_update.html.erb (4.7ms)
Rendered admin/invoices/_update.html.erb (4.6ms)
Rendered admin/invoices/_update.html.erb (4.6ms)
Rendered admin/invoices/_update.html.erb (1322.6ms)
Rendered admin/invoices/_update.html.erb (4.2ms)

此外,没有特定的行每次都需要更长的时间。

在我的视图文件中:

<% @updates.each do |update| %>
<%= render :partial => 'update', :locals => {:user => update[0]} #each of this is  a row %>
<% end %>

更新: 还建议如果这是一个很好的方法吗?即:多次循环。我不能用分页和Ajax来固定东西。任何其他方法。?

2 个答案:

答案 0 :(得分:6)

部分在渲染集合时非常有用。通过:collection选项将集合传递给partial时,将为集合中的每个成员插入一次partial:

<%= render :partial => 'update', :collection => @updates %>

还有一个简写。假设@updates是更新实例的集合,您只需在index.html.erb中编写它就可以产生相同的结果:

<%= render @updates %>

Section 3.4.5 of the Rails Guides详细解释了这一点。

答案 1 :(得分:4)

虽然我不确定为什么渲染中的滞后峰值,我强烈建议反转顺序:你给部分和内部的所有更新迭代并渲染行。

在视图文件

    <%= render :partial => 'update', :locals => {:updates => @updates} %>

在更新部分内

    <% updates.each do |update| %>
       RENDER LOGIC
    <% end %>

这就是为什么您不会遭受更新中每一行的部分加载开销。希望这有帮助!