2

我有一个我似乎无法定义的复杂规则,用户可以阅读他们自己的信件,或者如果他们有权限,他们可以阅读与任何类型无关的其他人的信件(如果他们是看到的类型控制它)。

class Letter < ActiveRecord::Base
  belongs_to :letter_template
  has_one    :letter_template_type, through: :letter_template
end

class LetterTemplateType < ActiveRecord::Base
  has_and_belongs_to_many :types
end

我已经尝试过了,认为它会覆盖它,但查看生成的 sql 它会执行“或(非字母匹配规则)”而不是“和(非字母匹配规则)”。

can :read, Letter
cannot :read, Letter, letter_template_type: { types: { active: [true, false] } } # the active [true, false] is just to find any type

我尝试的另一种方法是使用块/范围,但随后它抱怨“CanCan::Error:无法将 Active Record 范围与其他条件合并。而是使用散列或 SQL 来读取字母能力。”

can :read, Letter, Letter.without_type do |l|
  l.letter_template_type.nil? || l.letter_template_type.types.empty?
end

谁能帮我为这种情况定义一个规则?

4

1 回答 1

0

像这样使用,

 can :read, Letter, [] do |l|
   l.letter_template_type.nil? || l.letter_template_type.types.empty?
 end

您还必须a user can read their own letters在上面的块中添加条件,可能是l.user == your_ability_user.

于 2015-04-07T08:33:24.527 回答