2

我正在使用带有 cancan 1.6.7 和设备 1.4.8 的 Rails 3.0.9

我有一个疑问,罐头/罐头吗?/不能/不能?方法调用 current_ability 方法,因为

我刚刚在应用程序控制器中编写了 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 次?

4

1 回答 1

4

是的。每个can? cannot?authorize!调用current_ability方法(参见:CanCan 的 controller_additions.rb

另外,我不会担心 44 次调用current_ability. 您只需为每个请求创建一个 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)
于 2013-01-12T06:02:35.747 回答