Я бы просто использовал ability.rb
, чтобы определить, какие действия разрешены / запрещены для каждого типа объекта. Далее предполагается, что вы используете STI, и поэтому существует столбец stockable_type
, содержащий имя класса, который каждая строка представляет в вашей базе данных. Если вы не используете STI, вы все равно можете использовать другой метод для правильного определения типа объекта (возможно, передавая блок методам can
и cannot
вместо использования синтаксиса хэша [проверьте вики CanCan, Определение Способности для дополнительной информации]).
class Ability
include CanCan::Ability
def initialize(user)
user ||= User.new # guest user (not logged in)
can [:read], :all
can :new, Loan, :stockable_type => ["Book", "Magazine"]
cannot :new, Loan, :stockable_type => "ReferenceBook"
end
end
Тогда просто поймайте CanCan::AccessDenied
в своем LoansController
, и вы сможете перенаправить людей, пытающихся оформить справочные книги.
rescue_from CanCan::AccessDenied do |exception|
redirect_to some_url, :alert => "You can't check out reference books!"
end