2

我有一个包含多个表单的页面,表单和字段的加载时间似乎比它应该的要慢。

我的表格看起来像这样

-@leaders = Leader.select("id, full_name")
-@managers = Leader.select("id, full_name")

=form_for organization, remote: true do |f|
  =f.fields_for :projects, [project] do |project_fields|
    Status:
    =project_fields.collection_select :status_id, Status.all, :id, :title

    Current Manager
    =project_fields.fields_for :project_managers, [pm] do |project_manager_fields|
      -# 50+ entries          
      =project_manager_fields.collection_select :manager_id, @managers, :id, :full_name

    Current Lead
    =project_fields.fields_for :project_leads, [pl]  do |project_lead_fields|
      -# 50+ entries
      =project_lead_fields.collection_select :lead_id, @leaders, :id, :full_name

这只是一个人为的例子。我已经预先加载了所有内容,因此 fields_for 不会访问数据库。这有很大的不同,但它仍然太慢。我还尝试缓存每个使速度可以接受的内容,但我不认为缓存是预期的解决方案。

我还能做些什么来让它渲染得更快吗?

ruby 1.9.2 或 1.9.3、Rails 3.2.6、sqlserver 适配器(使用 mysql 一切都更慢)、Ubuntu 10.04 VM(托管在 windows 2k3 中)、4gb、3ghz xeon cpu

这在 mongrel/passenger 上的开发和生产速度很慢,其他页面加载速度可以接受。

4

3 回答 3

2

最近,在优化 Rails 应用程序以提高性能时,我发现一些 Rails 表单助手速度非常慢。通过将表单助手调用替换为原始字符串插值,我能够为几个频繁使用的页面增加渲染速度。

要获取助手生成的 HTML,请在 Chrome 中打开页面,按 F12 打开开发工具,进入元素,右键单击元素,然后选择“复制 HTML”。然后将原始 HTML 复制到您的模板中,并#{}根据需要使用字符串插值在正确的位置插入值。对于真实性令牌<input>,请使用value="#{form_authenticity_token}".

这很丑陋,有些人甚至可能会说丑陋,但它也很快。通过在一些关键位置应用此更改,以及数据库索引的优化和其他一些更改,我能够使上述应用程序在同一台服务器上处理 3.6 倍的负载!

于 2013-05-27T20:24:12.907 回答
0

仅使用模型的必要字段怎么样?

=form_for organization, remote: true do |f|
  =f.fields_for :projects, [project] do |project_fields|
    Status:
    =project_fields.collection_select :status_id, Status.find(:all,:select=>'id,title'), :id, :title

    Current Manager
    =project_fields.fields_for :project_managers, [pm] do |project_manager_fields|
      -# 50+ entries          
      =project_manager_fields.collection_select :manager_id, Manager.find(:all,:select=>'id,full_name'), :id, :full_name

    Current Lead
    =project_fields.fields_for :project_leads, [pl]  do |project_lead_fields|
      -# 50+ entries
      =project_lead_fields.collection_select :lead_id, Leader.find(:all,:select=>'id,full_name'), :id, :full_name
于 2013-05-27T15:36:07.727 回答
0

看到这么多表格,我想页面本身会太长,无法容纳一个屏幕。用户肯定无法在短时间内处理这么多信息。

所以,如果可能的话,为什么不首先加载必要的 div 呢?然后您可以使用切换来显示 Ajax 需要的表单。

于 2013-05-27T16:18:19.153 回答