2

我在 RoR 中设置了 CanCan,当我有以下情况时它可以正常工作:

class Ability
  include CanCan::Ability

  def initialize(user)
    user ||= User.new

    can :read, List, :user_id => user.id

  end
end

我想要做的是指定一个“或”条件,其中 user_id 匹配,否则它的访问级别为“公共”

can :read, List, (:user_id => user.id || :access => 'public')

但这当然行不通。

4

2 回答 2

6

为了完整起见,除了使用块之外,您还定义了多种能力:

can :read, List, user_id: user.id
can :read, List, access: 'public'

这在主要定义能力文档页面上进行了讨论。

我有点矛盾,我更喜欢哪个;我认为该块更具交流性,因为它不依赖于知道(a)能力是ored,(b)累积,和(c)依赖于顺序。

于 2013-05-26T01:01:05.160 回答
4

如文档中所述,您可以使用块。

can :read, List do |l|
  l.user_id == user.id || l.access == 'public'
end
于 2013-05-26T00:57:43.993 回答