Есть одно решение, которое я нашел до сих пор:
# application_controller.rb
def rescue_404
rescue_action_in_public CustomNotFoundError.new
end
def rescue_action_in_public(exception)
case exception
when CustomNotFoundError, ::ActionController::UnknownAction then
#render_with_layout "shared/error404", 404, "standard"
render template: "shared/error404", layout: "standard", status: "404"
else
@message = exception
render template: "shared/error", layout: "standard", status: "500"
end
end
def local_request?
return false
end
rescue_action_in_public
- это метод, который Rails вызывает для обработки большинства ошибок.
local_request?
метод говорит Rails прекратить сосатьесли это локальный запрос
# config/routes.rb
match '*path', controller: 'application', action: 'rescue_404' \
unless ::ActionController::Base.consider_all_requests_local
Он просто говорит, что не может найти какой-либо другой маршрут для обработки запроса (например, *path
), он должен вызвать действие rescue_404
на контроллере приложения (первый способ выше).
РЕДАКТИРОВАТЬ
Эта версия работала для меня хорошо!Попробуйте добавить к application.rb
# 404 catch all route
config.after_initialize do |app|
app.routes.append{ match '*a', to: 'application#render_not_found' } \
unless config.consider_all_requests_local
end
См .: https://github.com/rails/rails/issues/671#issuecomment-1780159