2016-05-11 4 views
2

Я пытаюсь спасти от ActionController::RoutingError, и я не могу заставить его работать. Я попробовал почти все, что мог найти в Интернете, включая rescue_from ActionController::RoutingError in Rails 4. У меня есть контроллер ошибок и страницы ошибок. Я должен работать cancan access denied и RecordNotFound, но я могу решить RoutingError.rescue_from ActionController :: RoutingError не работает

Для канкан Я использую это внутри application_controller.rb

rescue_from CanCan::AccessDenied do 
    render template: 'errors/error_403', status: 403 
    end 

и у меня есть это в моих маршрутах:

match "/404", to: "errors#error_404", via: :all 

Если бы я сделать то же самое для RoutingError это не будет работать.

Я также пробовал match '*path', :to => "errors#error_404", но получаю erors.

Как я могу это решить?

Edit: Если я сделать то же самое для RoutingError как для доступа отказано:

rescue_from ActionController::RoutingError do 
     render template: 'errors/error_404', status: 404 
    end 

он не будет работать.

ответ

10

ActionController::RoutingError возникает, когда Rails пытается выполнить запрос с помощью маршрута. Это происходит до тех пор, пока рельсы не назовут ваше приложение, поэтому ваш ApplicationController никогда не сможет спасти это исключение.

Вместо этого используется Rails по умолчанию exceptions_app - обратите внимание, что это приложение в режиме Rack - оно принимает хеш-код ENV с запросом и возвращает ответ - в этом случае статический файл /public/404.html.

Что вы можете сделать, это ваш Rails приложение Отрисовка страницы ошибок динамически вместо:

# config/application.rb 
config.exceptions_app = self.routes # a Rack Application 

# config/routes.rb 
match "/404", :to => "errors#not_found", :via => :all 
match "/500", :to => "errors#internal_server_error", :via => :all 

Вы бы затем настроить конкретный контроллер для обработки страниц ошибок - не делайте этого в классе ApplicationController так как вы добавляете метод not_found и internal_server_error ко всем вашим контроллерам!

class ErrorsController < ActionController::Base 
    protect_from_forgery with: :null_session 

    def not_found 
    render(status: 404) 
    end 

    def internal_server_error 
    render(status: 500) 
    end 
end 

Код заимствованный из Matt Brictson: Dynamic Rails Error Pages - прочитать его для полного изношенном.

+0

Благодарим вас за такой сложный ответ. Теперь я понимаю это лучше. –

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