1

这是我的 Ability.rb 文件:

class Ability
  include CanCan::Ability

  def initialize(user)
    user.permissions.each do |permission|
      can permission.action.to_sym,
          permission.thing_type.constantize {|thing| thing.nil? || permission.thing.nil? || permission.thing_id == thing.id}
    end
  end
end

事物是多态关联。我试图了解如何将块传递给 can 工作。我在整个 wiki 中搜索了 CanCan,但找不到解释。

4

1 回答 1

1

将块传递给 cancan 允许您实现更复杂的权限检查,这取决于对象本身的状态。

当它只是您要检查的对象的属性时,您不需要块:

can :read, Project, :active => true

允许用户仅读取活动项目。如果您需要调用项目的editable方法,那么您可以改为

can :read, Project do |project|
  project.editable?
end

在 cancan 检查您是否可以读取特定项目时(即,当before_filter火灾或您调用 `can? :read, some_project 时)然后调用该块

wiki 上有一个关于此的页面:Definingabilities with blocks

在您的情况下,其意图似乎是权限对象可以授予对整个类的访问权限(如果thing_type已设置但thing_id为空)或授予该类的特定实例。

但是,您发布的代码实际上并没有这样做。在传递块的 2 种方式中,{}绑定比do...end根本不传递块更紧密can。相反,它被传递给constantize,它会忽略它。您可以通过使用括号或使用do...end

于 2013-08-25T08:59:07.950 回答