我在使用CanCan功能模型上定义的方法时遇到了问题:
模型
def Car
def can_paint?
..some conditions, return true or false..
end
end能力
can :paint, Car, :user_id => user.id, Car.can_paint?CarsController
def paint
@car = ..find the car..
return redirect_to jobs_path unless can? :paint, @car
...
end当调用画图操作时发生错误。
/.../app/models/ability.rb:11: syntax error, unexpected '\n', expecting tASSOC
#error points to the line in ability defined above如果我从能力中删除了Car.can_paint?,那么就没有错误。
问题:
如何在abilities?
can_paint?定义功能,没有办法访问为模型找到的实际实例,即@car,而不必使用Car,这样我就可以编写:can :paint, Car, :user_id => user.id ***if @car.can_paint?***
发布于 2011-02-13 21:42:52
can方法接受要检查的条件的散列。在您的示例中,当您调用它时:
can :paint, Car, :user_id => user.id, Car.can_paint?它实际上是在传递以下内容:
can :paint, Car, {:user_id => user.id, true}这不是一个有效的散列,很可能是expecting tASSOC错误的来源。(您还在类上调用实例方法,但这不是真正的问题)
但是,您可以将块作为条件传递,因此,下面这样的内容将用于检查实际对象:
can :paint, Car, :user_id => user.id do |car|
car.can_paint?
end这将正确地检查用户是否拥有绘制汽车实例的权限。
作为参考,请留意CanCan的文档,因为它们提供了一些非常好的示例- https://github.com/ryanb/cancan/wiki/Defining-Abilities
https://stackoverflow.com/questions/4986922
复制相似问题