我正在使用 Rails 3.0.9、cancan 1.6.7 和设备 1.4.8
我有一个疑问,可以/可以吗?/不能/不能?方法调用 current_ability 方法,因为
我刚刚在应用程序 Controller 中编写了 current_ability 方法,该方法覆盖了 cancan 的 current_ability 方法
在 application_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 次?
最佳答案
是的。每个 can?
cannot?
和 authorize!
都会调用 current_ability
方法(参见: CanCan's controller_additions.rb )
此外,我不会担心对 current_ability
的 44 次调用。每个请求仅创建一个能力对象,因为您在 Controller 上使用实例变量,并使用 ||=
运算符(即内存)。这不会对性能造成重大影响。
例如,让我们做一个快速基准测试来获取相同的缓存对象 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)
关于ruby-on-rails-3 - cancan 的 current_ability 方法是否为每个 can 方法调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12855581/