0

我有以下幾種觀點一個Rails應用程序: 渲染的Rails快3.1視圖

<style> 
    table.diary tbody tr td { 
    background :transparent; 
    } 

    td { 
    padding: 4px; 
    <% if current_user.is_transport_user? %> 
    cursor: pointer; 
    <% end %> 
    border: 1px solid transparent; 
    } 

    td.dashed-cell { 
    border: 3px solid #CCCCCC; 
    min-width: 150px; 
    } 
    td.provisional { 
    cursor: pointer; 
    border: 3px solid #000000; 
    min-width: 150px; 
    } 
    td.unexpected { 
    cursor: pointer; 
    border: 3px solid #FF0000; 
    min-width: 150px; 
    } 
    td.moved { 
    cursor: pointer; 
    border: 3px solid #FFCC00; 
    min-width: 150px; 
    } 
    td.confirmed { 
    cursor: pointer; 
    border: 3px solid #006600; 
    min-width: 150px; 
    } 

    #toolbar { 
    padding: 10px 4px; 
    } 
</style> 

<span id="toolbar" class="ui-widget-header ui-corner-all"> 
    <input type="text" id="datepicker" size=30> 
    <button id="today"> 
     today 
    </button> </span> 
<p> 
    <table class="diary"> 
     <thead> 
      <th> Time </th> 
      <% if current_user.is_booking_manager? %> <th> Pallets </th> 
      <th> Slots </th> 
      <% end %> 
     </thead> 
     <% @slot_times.each do |slot_time| %> 
     <tr class="slot_time" id="slot_time<%= slot_time.id %>"> 
      <td class="time-cell"> <%= slot_time.datetime.strftime('%H:%M') %> </td> 
      <% if current_user.is_booking_manager? %> <td class="pallets"> <%= slot_time.number_of_pallets %> </td> 
      <td class="button_bar"> <%= form_for slot_time, :url => diary_slot_time_set_capacity_path(@site, slot_time) do |f| %> 
      <%= f.number_field :capacity, :id=>"capacity#{slot_time.id}", :size=>2, :min=>0, :onchange => 'this.form.submit();' %> 
      <% end %> 
      <%= button_to "Add", diary_slot_time_add_slot_path(@site, slot_time), :remote => true, :id => "add_slot" %> 
      <%= button_to "Remove", diary_slot_time_remove_slot_path(@site, slot_time), :remote => true, :id => "remove_slot#{slot_time.id}", :disabled => disable_remove?(slot_time) %> </td> 
      <% end %> 

      <% slot_time.bookings_visible_to(current_user).each do |booking| %> 
      <% unless booking.id.nil? %> 
      <%= render :partial => "booking", :locals => { :booking => booking } %> 
      <% end %> 
      <% end %> 

      <% for i in 1..slot_time.number_of_free_slots %> 
      <%= render :partial => "free_slot", :locals => { :slot_time => slot_time } %> 
      <% end %> 

      <% slot_time.bookings.each do |booking| %> 
      <% if booking.id.nil? %> 
      <div style="display:none;"> 
       <div id="create_booking<%= slot_time.id %>" title="Create Booking"> 
        <%= render :partial => "booking_dialog", :locals => { :booking => booking } %> 
       </div> 
      </div> 
      <% end %> 
      <% end %> 
     </tr> 
     <% end %> 
    </table> 
    <script> 

     $(function() { 
     $("#datepicker").datepicker({ 
      dateFormat : "DD, d MM, yy", 
      onSelect : function(dateText, inst) { 
       var newdate = new Date(dateText); 
       var yyyy = newdate.getFullYear().toString(); 
       var mm = (newdate.getMonth() + 1).toString(); 
       var dd = newdate.getDate().toString(); 
       if(mm.length == 1) { 
        mm = '0' + mm; 
       } 
       if(dd.length == 1) { 
        dd = '0' + dd; 
       } 
       document.location.href = yyyy + '-' + mm + '-' + dd; 
      } 
     }).datepicker("setDate", new Date("<%= @slot_day.day %>")); 
    }); 

    $("#today").button().click(function() { 
     document.location.href = "<%= diary_url(@site) %>"; 
    }); 

    </script> 

我希望做的是加快了這一觀點是目前的渲染什麼:

Rendered slot_days/_booking_dialog.html.erb (3.7ms) 
Rendered slot_days/show.html.erb within layouts/application (1488.0ms) 
AdminLevel Load (0.2ms) 
    SELECT "admin_levels".* FROM "admin_levels" WHERE "admin_levels"."id" = 3 LIMIT 1 
Site Load (0.2ms) 
    SELECT "sites".* FROM "sites" 
Completed 200 OK in 1818ms (Views: 1493.5ms | ActiveRecord: 39.9ms) 

加速此視圖的最佳方法是什麼?

我明白一些人可能會對此帖發表評論,指出我應該在資產管道中使用我的和javascript。但是你會注意到,在我的CSS下的td我有erb節,因爲在我的JavaScript。如果我將它放入資產管道中,肯定會發生衝突,並導致我的CSS和JavaScript停止工作。

+0

對於JavaScript和CSS,沒有理由有再培訓局的CSS時,而不是你能如在相關的HTML標籤上切換一個類屬性(使用ERb)。 JavaScript應該至少移入一個'.erb.js'中。這些問題不會導致您的性能問題,但絕對值得您關注。 – 2012-03-12 16:14:40

+0

好的,我已經完成了。 – David 2012-03-12 16:16:38

+0

「@ slot_times」中有多少項目,每個人有多少個「預訂」?您正在另一個循環內執行多個循環,這可能是性能問題的根源。你可以消除其中的任何一種,或將它們合併成一個單一的循環(如果僅僅爲了可讀性,可能在你的控制器中)?考慮做一些[更深入的分析](http://guides.rubyonrails.org/performance_testing.html#view)找出大部分時間在哪裏。 – 2012-03-12 16:27:23

回答

1

我想你應該首先將你的文件解耦成幾個。 每種類型的數據一個:css,javascript,html。

這樣你就可以利用Rails提供的資產管道。

安東尼

1

您可以嘗試緩存。

無論是動作緩存在你的控制器:

caches_page :action_name

或視圖本身,片段緩存。像

<% cache do %> 
All available products: 
<% Product.all.each do |p| %> 
    <%= link_to p.name, product_url(p) %> 
<% end %> 
<% end %> 

有用的鏈接的東西:http://guides.rubyonrails.org/caching_with_rails.html