我正在使用cancan gem,而在ability.rb中,我想检查具有某个角色的用户是否可以更新另一个对象,当且仅当用户'是另一个对象的一部分时(即,模型之间存在关联,用户可以在对象的users
方法中找到。
我想使用include?
方法查看在生成的@current_user
数组中是否找到了User
。
通过ability.rb测试代码时,它始终返回false
。如果我在rails控制台中运行相同的代码,它可以正常工作。
我发现如果include?
对象与传递的对象不是同一个类,Array
不起作用,但是我通过class.name
打印了它们的类,它们是相同。
我最终使用detect
并比较了ID,但我想知道以前是否有人遇到过此类问题,如果你能对此有所了解。
delete_if
发生了类似的事情,在删除了100中的20之后,计数仍然返回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
......对吗?
答案 0 :(得分:1)
Cancan具有查询关联的内置机制。如果不知道您的确切设置,这应该与您在Ability
课程中设置的方式非常接近:
can :view, MyObject, users: { id: user.id }