Я некоторое время боролся с этим и наконец дошел до того, что кажется, что CanCan не позволяет вам авторизовать коллекцию записей.Например:
ads_controller.rb
def index
@ads = Ad.where("ads.published_at >= ?", 30.days.ago).order("ads.published_at DESC")
authorize! :read, @ads
end
able.rb
def initialize(user)
user ||= User.new # Guest user
if user
if user.role? :admin # Logged in as admin
can :manage, :all
else # Logged in as general user
can :read, Ad
can :read_own, Ad, :user_id => user.id
can :create, Ad
end
else # Not logged in (Guest)
can :read, Ad
end
end
В результате появляется сообщение о несанкционированном доступе при попытке получить доступ к действию индекса.
You are not authorized to access this page.
Однако, если вы измените вызов авторизации в действии index, чтобы проверить класс Ad, а не коллекцию, как это
def index
@ads = Ad.where("ads.published_at >= ?", 30.days.ago)
authorize! :read, Ad
end
... он работает нормально.
Любая помощь в объяснении этого будет принята с благодарностью.
Заранее спасибо.
пс.Первоначально я получал петли перенаправления при попытке решить это.Оказывается, есть одна ошибка с рекомендуемым значением rescue_from, которую вы помещаете в контроллер приложения, чтобы получить хорошие сообщения об ошибках.Если ваш root_path установлен в то же место, где вы авторизуетесь!Вызов не является истинным (или неудачным), вы получите цикл перенаправления.Закомментируйте rescue_from Узнал, что это трудный путь.