Как вызвать метод модели при определении способности CanCan? - PullRequest
1 голос
/ 14 февраля 2011

У меня проблема с использованием метода, определенного для модели в способностях 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? из способности, то ошибки не возникает.

Вопросы:

  1. Как использовать can_paint? в способностях?

  2. При определении способностей нет способа получить доступ к фактическому экземпляру, найденному для модели, например @автомобиль вместо того, чтобы использовать Car, чтобы я мог написать:
    can :paint, Car, :user_id => user.id ***if @car.can_paint?***

1 Ответ

2 голосов
/ 14 февраля 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...