0

首先,我的联想:

Form has_many :agreements
Agreement belongs_to :student

我正在尝试定义当前用户的一项能力,can :read, Form当其协议之一属于当前用户时。

我试图定义这样的能力:

Ability.rb:

can :read, Form do |f|
  f.agreements.select { |a| a.student_id == user.id }.nil? == false
end

我也试过:

can :read, Form, agreements: { student_id:  user.id }

不幸的是,第一个解决方案允许所有学生查看所有表格,即使他们没有附加到其中一个表格协议。第二种解决方案不允许任何学生查看表格,即使他们附加到表格的协议之一。

我究竟做错了什么?

4

1 回答 1

1

这条线不好:

f.agreements.select { |a| a.student_id == user.id }.nil? == false

原因是它#select总是会返回一个数组。如果没有与student_id匹配的协议user.id,那么您将得到一个空数组 ( [])。但是#nil?在任何数组上,包括一个空数组,总是错误的。所以这条线总是评估为真。

修复非常简单。使用 rails 方法#blank?而不是#nil?. nil如果对象是OR 如果它是 ,那将返回 true empty。并[].empty?返回true

tldr:将上面的行更改为

f.agreements.select { |a| a.student_id == user.id }.blank? == false
于 2013-06-18T20:49:10.540 回答