Друг вказав мені на елегантне рішення, яке не лише обробляє 404, а й 500 помилок. Насправді він обробляє кожну помилку. Ключовим є те, що кожна помилка генерує виняток, який поширюється вгору через стек проміжних засобів стійки, доки її не обробить одна з них. Якщо вам цікаво дізнатись більше, ви можете переглянути цей чудовий скринкаст . У Rails є власні обробники для винятків, але ви можете замінити їх менш документально підтвердженою exceptions_appопцією налаштування. Тепер ви можете написати власне проміжне програмне забезпечення або ж направити помилку назад у рейки, наприклад:
config.exceptions_app = self.routes
Тоді вам просто потрібно узгодити ці маршрути у вашому config/routes.rb:
get "/404" => "errors#not_found"
get "/500" => "errors#exception"
І тоді ви просто створюєте контролер для обробки цього.
class ErrorsController < ActionController::Base
def not_found
if env["REQUEST_PATH"] =~ /^\/api/
render :json => {:error => "not-found"}.to_json, :status => 404
else
render :text => "404 Not found", :status => 404
end
end
def exception
if env["REQUEST_PATH"] =~ /^\/api/
render :json => {:error => "internal-server-error"}.to_json, :status => 500
else
render :text => "500 Internal Server Error", :status => 500
end
end
end
Останнє, що слід додати: у середовищі розробки rails звичайно не відображає 404 або 500 сторінок, а натомість друкує зворотну трасування. Якщо ви хочете бачити свою ErrorsControllerдію в режимі розробки, вимкніть елементи зворотного відстеження у вашому config/enviroments/development.rbфайлі.
config.consider_all_requests_local = false