2012-10-12 57 views
2

我正在使用cancan 1.6.7和設備1.4.8的Rails 3.0.9cancan的current_ability方法是否需要每種罐頭方法?

我懷疑,Can/Can? /不能/不能?方法調用current_ability方法,因爲

我剛寫在應用控制器的current_ability方法,其覆蓋康康舞的current_ability方法

在apllication_controller.rb

def current_ability 
     if current_user.kind_of(User) 
     @current_ability ||= UserAbility.new(current_user) 
     else 
     @current_ability ||= AdminAbility.new(current_admin) 
     end 
    end 

發現,在此方法調用每44倍頁面請求

登錄後加載的索引頁面包含35個菜單項(使用can方法加載)和3個操作的內容(使用can方法加載) 爲什麼current_ability方法被調用了44次?

回答

3

是的。每can?cannot?authorize!調用current_ability方法(參見:CanCan's controller_additions.rb

而且,我就不會擔心44調用current_ability。每個請求只能創建一個Ability對象,因爲您在控制器上使用實例變量,並使用||=運算符(即memoization)。這不是一個重大的性能問題。

例如,讓我們做一個快速的基準,以10萬次獲取相同的緩存的對象...

require "benchmark" 

def cached_object 
    @foo ||= String.new('foobar') 
end 

cached_object.object_id.to_s(16) # => 3ffc5cc53cb0 
cached_object.object_id.to_s(16) # => 3ffc5cc53cb0 (same object is returned) 

Benchmark.bm(7) do |b| 
    b.report("Cached Object") { 100000.times {cached_object}} 
end 

#    user  system total  real 
# Cached Object 0.010000 0.000000 0.010000 (0.017291) 
+0

感謝簡要說明。 – nishanthan

相關問題