Ein Freund wies mich auf eine elegante Lösung hin, die nicht nur 404, sondern auch 500 Fehler behandelt. Tatsächlich behandelt es jeden Fehler. Der Schlüssel ist, dass jeder Fehler eine Ausnahme generiert, die sich durch den Stapel von Rack-Middlewares nach oben ausbreitet, bis sie von einem von ihnen behandelt wird. Wenn Sie mehr erfahren möchten, können Sie sich diesen hervorragenden Screencast ansehen . Rails verfügt über eigene Handler für Ausnahmen, die Sie jedoch mit der weniger dokumentierten exceptions_appKonfigurationsoption überschreiben können . Jetzt können Sie Ihre eigene Middleware schreiben oder den Fehler wie folgt zurück in die Schienen leiten:
config.exceptions_app = self.routes
Dann müssen Sie nur noch diese Routen in Ihrem config/routes.rb:
get "/404" => "errors#not_found"
get "/500" => "errors#exception"
Und dann erstellen Sie einfach einen Controller, um dies zu handhaben.
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
Eine letzte Sache, die hinzugefügt werden muss: In der Entwicklungsumgebung rendert Rails normalerweise nicht die 404- oder 500-Seiten, sondern druckt stattdessen eine Rückverfolgung. Wenn Sie möchten, dass Sie ErrorsControllerim Entwicklungsmodus in Aktion sind, deaktivieren Sie das Backtrace-Material in Ihrer config/enviroments/development.rbDatei.
config.consider_all_requests_local = false