ruby-on-rails-3 - cancan 的 current_ability 方法是否为每个 can 方法调用?

标签 ruby-on-rails-3 cancan

我正在使用 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/

相关文章:

ruby-on-rails-3 - 使用delayed_job异步发送带有附件的电子邮件

ruby-on-rails - CanCan-如何允许用户仅更新和删除自己的对象

ruby-on-rails - 与设计/cancan 不同的注册过程但只有一个用户模型?

ruby - 在两个 ActiveRecord 类之间合并/复制属性的好方法?

ruby-on-rails - 从现有的mysql表在rails中创建迁移文件

ruby - 在 PostgreSQL 中按指定列分组

ruby-on-rails - 如何访问 Ruby 控制台中的命名空间方法?

ruby-on-rails - 在 Rails 中使用 cancan 授权 Controller 操作

ruby-on-rails - 设计/Rolify/CanCan 2.0 : Preventing users from changing a user's role

ruby-on-rails - Rails 4 不完全支持 CanCan