Ich habe folgenden Fehler erhalten:
ActionController::RoutingError (No route matches [GET] "/images/favicon.ico")
Ich möchte die error404-Seite für Links anzeigen, die nicht vorhanden sind.
Wie kann ich das erreichen?
In application_conroller.rb
fügen Sie Folgendes hinzu:
# You want to get exceptions in development, but not in production.
unless Rails.application.config.consider_all_requests_local
rescue_from ActionController::RoutingError, with: -> { render_404 }
end
def render_404
respond_to do |format|
format.html { render template: 'errors/not_found', status: 404 }
format.all { render nothing: true, status: 404 }
end
end
Ich rette normalerweise auch folgende Ausnahmen, aber das liegt an Ihnen:
rescue_from ActionController::UnknownController, with: -> { render_404 }
rescue_from ActiveRecord::RecordNotFound, with: -> { render_404 }
Erstellen Sie den Fehlercontroller:
class ErrorsController < ApplicationController
def error_404
render 'errors/not_found'
end
end
Dann in routes.rb
unless Rails.application.config.consider_all_requests_local
# having created corresponding controller and action
get '*path', to: 'errors#error_404', via: :all
end
Und das Letzte ist, not_found.html.haml
(oder was auch immer Sie als Template-Engine verwenden) unter /views/errors/
zu erstellen:
%span 404
%br
Page Not Found
@Andrey Deineko, deine Lösung scheint nur für die RoutingError
s zu funktionieren, die manuell in einem Controller erstellt werden. Wenn ich es mit der URL my_app/not_existing_path
versuche, erhalte ich immer noch die Standardfehlermeldung.
Ich vermute, das liegt daran, dass die Anwendung die Controller nicht einmal erreicht, da Rails den Fehler zuvor auslöst.
Der Trick der das Problem gelöst hat, war für mich die folgende Zeile am ende der Routen:
Rails.application.routes.draw do
# existing paths
match '*path' => 'errors#error_404', via: :all
end
um alle nicht vordefinierten Anforderungen abzufangen.
Dann können Sie im ErrorsController respond_to
verwenden, um Anforderungen in den Bereichen HTML, Json ... zu liefern:
class ErrorsController < ApplicationController
def error_404
@requested_path = request.path
repond_to do |format|
format.html
format.json { render json: {routing_error: @requested_path} }
end
end
end
Ich habe diesen Fehler erhalten. Ich habe favicon image in app/assets/images
kopiert und es funktioniert für mich.