Страница пользовательских ошибок Rails работает и не работает - PullRequest
0 голосов
/ 24 мая 2019

ruby-2.3.7 Rails 5.1.4

Я пытаюсь узнать о страницах ошибок в приложениях Rails: как их создавать и как их вызывают / запускают. Я прочитал довольно много постов и блогов об этом. Я нашел несколько, которые используют тот же подход. Это кажется достаточно простым, поэтому я попытался реализовать его.

Когда я перехожу прямо на мою новую страницу 404 или 500: ...myapp/404 или ...myapp/500, я получаю правильную пользовательскую страницу 404/500. Но когда я запускаю другую ошибку 500, я не делаю. Т.е.: ...myapp.employee/99999 выдает ошибку, потому что такого сотрудника нет:

500 Internal Server Error If you are the administrator of this website, then please read this web application's log file and/or the web server's log file to find out what went wrong

Как получить ошибки, чтобы перейти на мои новые страницы ошибок?

Код:

config/environments/development.rb:
-------
# see error pages in dev site
config.consider_all_requests_local = false # true


config/application.rb:
-------
# added for error pages
config.exceptions_app = self.routes


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


controllers/errors_controller.rb
-----
class ErrorsController < ApplicationController
  def not_found
    respond_to do |format|
      format.html { render status: 404 }
    end
  end

  def internal_server_error
    respond_to do |format|
      format.html { render status: 500 }
    end
  end
end

---> these work so I wont paste the content here.
app/views/errors/not_found.html.erb
app/views/errors/internal_server_error.html.erb

Это правильный подход? Если да, то что я упускаю или не понимаю.

Спасибо за любую помощь.

1 Ответ

0 голосов
/ 24 мая 2019

Вы должны добавить их в свой контроллер верхнего уровня (приложения) и соответственно спасти. Пример кода из проекта, над которым я работаю:


rescue_from ActiveRecord::RecordNotFound do |e|
  puts "#{e.inspect}, PARAMS: #{params.inspect}" if Config[:verbose_tests]
  respond_with_404
end
rescue_from ActionController::RoutingError do |e|
  puts "#{e.inspect}, PARAMS: #{params.inspect}" if Config[:verbose_tests]
  respond_with_404
end
rescue_from Pundit::NotAuthorizedError do
  respond_with_403
end

В вашем случае это будет что-то вроде:

// app/controllers/application_controller.rb

rescue_from ActiveRecord::RecordNotFound do
  not_found
end
rescue_from ActionController::RoutingError do
  not_found
end
rescue_from ActionController::StandardError do
  internal_server_error
end

Убедитесь, что у вас есть доступ к вашим internal_server_error и not_found методам внутри вашего контроллера приложений, вы даже можете определить их там, а затем, когда выдается ошибка, ваше приложение должно реагировать соответствующим образом.

...