CanCanCan выдает регулярную ошибку Rails для исключения, а не флэш-сообщение, как я указал
Я использую CanCanCan, Devise и Rolify.
Мой ApplicationController
выглядит следующим образом:
class ApplicationController < ActionController::Base
# Prevent CSRF attacks by raising an exception.
# For APIs, you may want to use :null_session instead.
protect_from_forgery with: :exception
before_filter :new_post
rescue_from CanCan::AccessDenied do |exception|
redirect_to root_url, :alert => exception.message
end
def new_post
@post = Post.new
end
end
Мой routes.rb
выглядит следующим образом:
authenticate :user, lambda { |u| u.has_role? :admin or :editor } do
get 'newsroom', to: 'newsroom#index', as: "newsroom"
get 'newsroom/published', to: 'newsroom#published'
get 'newsroom/unpublished', to: 'newsroom#unpublished'
end
# truncated for brevity
root to: "posts#index"
Это мой ability.rb
, который имеет значение:
elsif user.has_role? :member
can :read, :all
cannot :read, :newsroom
Итак, когда я вошел в систему как :member
, и я пытаюсь перейти к /newsroom
, я получаю эту ошибку:
NameError at /newsroom
uninitialized constant Newsroom
Вместо того, чтобы перенаправляться на root_url
с :alert
, как я ожидал.
Не уверен, что происходит здесь.
Изменить 1
Для чего это стоит, я получаю только это, когда добавляю это в свой NewsroomController
:
authorize_resource
Ответы
Ответ 1
Оказывается, проблема была в том, что я разрешил свой контроллер Newsroom
, потому что Newsroom
был невосстанавливаемым контроллером (т.е. не было модели, связанной с Newsroom
.
Мне пришлось добавить это в верхнюю часть моего контроллера:
authorize_resource :class => false
Как указано здесь: https://github.com/CanCanCommunity/cancancan/wiki/Non-RESTful-Controllers#alternative-authorize_resource
Ответ 2
Я не очень разбираюсь в CanCan, но вижу, что вы спасаете от CanCan:: AccessDenied, тогда как исключение - NameError. Таким образом, вы не должны ожидать, что ваш спасательный блок будет работать.
Я бы сказал, что вы, вероятно, где-то написали "Newsroom" или обращаетесь к нему там, где он недоступен.