0

我正在使用 cancan gem,并且在ability.rb 中,我想检查具有特定角色的用户是否可以更新另一个对象,当且仅当用户“是”另一个对象的一部分时(也就是说,有一个模型之间的关联,用户在对象的users方法中找到)。

我想使用该include?方法查看是否@current_user在结果User数组中找到。

false通过ability.rb 测试代码时它总是返回。如果我在 rails 控制台中运行相同的代码,它工作正常。

我发现include?如果Array对象与传递的对象不属于同一类,则不起作用,但我通过 打印了它们的类class.name,它们是相同的。

我最终使用detect并比较了 id,但我想知道以前是否有人遇到过此类问题,以及您是否可以对此有所了解。

发生了类似的事情delete_if,在从 100 中删除 20 之后,count 仍然返回 100,但是每个循环只打印应该存在的那些(20)。在 RoR 环境中执行时会发生这种情况,但是具有相同代码的 rails 控制台的行为与预期的一样 ( array.count # => 20)。

编辑 20131007

关于这个include?问题的一些代码。该位始终返回 false,即使用户在来自 的结果数组中也是如此course.institution.users

    can [:read, :update], Course do |course|
      val = course.institution.users.include? user
    end

如果我采取同样的做法,并在 rails 控制台中为给定的课程和用户尝试它,如下所示:

    Course.find(course_id).institution.users.include? User.find(user_id)

它按预期工作,返回true然后在数组中找到用户,false如果没有。

因此,即使该特定模型的==操作符在某种程度上很奇怪,我在两种情况下都在处理相同的数组,所以它应该在两种情况下都失败或运行良好,而不仅仅是在康康语ability.rb中......对?

4

1 回答 1

1

Cancan 有一个查询关联的内置机制。在不知道您的确切设置的情况下,这应该与您在Ability课堂上的设置方式接近:

can :view, MyObject, users: { id: user.id }
于 2013-10-07T21:54:27.127 回答