cancan的current_ability方法是否需要每个can方法?

时间:2012-10-12 09:00:58

标签: ruby-on-rails-3 cancan

我正在使用带有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次?

1 个答案:

答案 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)