Метод 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