在Cancancan中定义组合复杂能力规则

时间:2015-04-07 06:54:33

标签: ruby-on-rails ruby authorization cancan cancancan

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

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

我尝试的另一种方式是使用块/范围但是它会抱怨 “惨惨::错误:        无法将Active Record范围与其他条件合并。而是使用散列或SQL来读取Letter函数。“

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

有人可以帮我定义这种情况的规则吗?

1 个答案:

答案 0 :(得分: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