In application_conroller.rb
fügen Sie den folgenden:
# 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 in der Regel auch Ausnahmen retten folgen, aber das ist bis zu Ihnen:
rescue_from ActionController::UnknownController, with: -> { render_404 }
rescue_from ActiveRecord::RecordNotFound, with: -> { render_404 }
Erstellen Sie den Fehler Controller:
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, was zu schaffen not_found.html.haml
(oder was auch immer Template-Engine Sie verwenden) unter /views/errors/
:
%span 404
%br
Page Not Found
Das funktioniert nicht in Rails 4.2.5. Ich vermute, dass die Ausnahme von ActionDispatch ausgelöst wird, bevor ein Controller-Code ausgeführt wird. – depquid
@depquid Ich habe es in den Zeiten von Rails 4.0.x geschrieben, aber habe es gerade mit Rails 4.2.5 getestet - ich nehme an, du hast keine Route hinzugefügt und nicht die 'errors_controller.rb' erstellt :) Wenn das der Fall ist - Bitte vergewissern Sie sich, dass Sie den Downvote zurückziehen, es sei denn, Sie haben weitere Gründe, ihn zu verlassen. –
Entschuldigung, ich habe die Route nicht korrekt eingerichtet. Aber warum, rescue_from ActionController :: RoutingError, mit: -> {render_404} 'wenn Sie direkt zur Aktion weitergeleitet werden? – depquid