我正在使用带有cancan 1.6.7和设备1.4.8的Rails 3.0.9
我怀疑,能/可以吗? /不能/不能?方法调用current_ability方法,因为
我刚刚在应用程序控制器中编写了current_ability方法,它覆盖了cancan的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次?
答案 0 :(得分:3)
是。每个can?
cannot?
和authorize!
都会调用current_ability
方法(参见:CanCan's controller_additions.rb)
另外,我不会担心对current_ability
的44次调用。您只是为每个请求创建一个Ability对象,因为您在控制器上使用了一个实例变量,并使用||=
运算符(即memoization)。这不是一个重大的性能影响。
例如,让我们做一个快速的基准测试来获取相同的缓存对象100,000次......
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)