2013-11-20 6 views
3

Я пытаюсь реализовать пользовательскую обработку ошибок, а также использовать CanCan. Когда пользователь достигает области, к которой им не разрешен доступ, возникает ошибка CanCan :: AccessDenied, и они должны быть отправлены на корневой URL. Вместо этого «rescue_from Exception» захватывает CanCan :: AccessDenied, и пользователь получает ошибку 500. Что я делаю не так?Пользовательская обработка ошибок и cancan

#application_controller.rb 
rescue_from CanCan::AccessDenied do |exception| 
    redirect_to main_app.root_url, :alert => exception.message 
end 

rescue_from Exception, 
    :with => :render_error 
rescue_from Mongoid::Errors::DocumentNotFound, 
    :with => :render_not_found 
rescue_from ActionController::RoutingError, 
    :with => :render_not_found 
rescue_from ActionController::UnknownController, 
    :with => :render_not_found 
rescue_from AbstractController::ActionNotFound, 
    :with => :render_not_found 


def render_not_found(exception) 
    render :template => "/errors/404.html", 
     :layout => 'errors.html', 
     :status => 404 
end 

def render_error(exception) 
    render :template => "/errors/500.html", 
     :layout => 'errors.html', 
     :status => 500 
end 

ответ

0

Вы пытались переупорядочить rescue_from исключения/ошибки, более общие сначала, более конкретные позже, например.

rescue_from StandardError, 
    :with => :render_error 
rescue_from Mongoid::Errors::DocumentNotFound, 
    :with => :render_not_found 
rescue_from ActionController::RoutingError, 
    :with => :render_not_found 
rescue_from ActionController::UnknownController, 
    :with => :render_not_found 
rescue_from AbstractController::ActionNotFound, 
    :with => :render_not_found 
rescue_from CanCan::AccessDenied do |exception| 
    redirect_to main_app.root_url, :alert => exception.message 
end 

Примечание: Возможно, вы захотите заменить генерическое исключение на стандартное значениеError.

+0

Это решение сработало для меня. В документации Rails четко указано, что порядок имеет значение, как вы отметили. –

Смежные вопросы