Ich möchte eine 404-Seite in Rails "fälschen". In PHP würde ich einfach einen Header mit dem Fehlercode als solchen senden:
header("HTTP/1.0 404 Not Found");
Wie wird das mit Rails gemacht?
Ich möchte eine 404-Seite in Rails "fälschen". In PHP würde ich einfach einen Header mit dem Fehlercode als solchen senden:
header("HTTP/1.0 404 Not Found");
Wie wird das mit Rails gemacht?
Ich wollte eine "normale" 404 für jeden angemeldeten Benutzer, die nicht ein Administrator ist zu werfen, so endete ich schreiben etwas wie dieses in Rails 5:
class AdminController < ApplicationController
before_action :blackhole_admin
private
def blackhole_admin
return if current_user.admin?
raise ActionController::RoutingError, 'Not Found'
rescue ActionController::RoutingError
render file: "#{Rails.root}/public/404", layout: false, status: :not_found
end
end
Erhöhung der ActionController::RoutingError('not found')
kam mir schon immer etwas seltsam vor - im Falle eines nicht authentifizierten Benutzers entspricht dieser Fehler nicht der Realität - die Route wurde gefunden, der Benutzer ist nur nicht authentifiziert.
Ich bin zufällig auf config.action_dispatch.rescue_responses
und ich denke, dass dies in einigen Fällen eine elegantere Lösung für das genannte Problem ist:
# application.rb
config.action_dispatch.rescue_responses = {
'UnauthenticatedError' => :not_found
}
# my_controller.rb
before_action :verify_user_authentication
def verify_user_authentication
raise UnauthenticatedError if !user_authenticated?
end
Das Schöne an diesem Ansatz ist:
ActionController::RoutingError
, aber in Entwicklungsumgebungen erhalten Sie eine aussagekräftigere Fehlermeldungnot_found
Methode, die überall verfügbar sein muss.Um die Fehlerbehandlung zu testen, können Sie etwa so vorgehen:
feature ErrorHandling do
before do
Rails.application.config.consider_all_requests_local = false
Rails.application.config.action_dispatch.show_exceptions = true
end
scenario 'renders not_found template' do
visit '/blah'
expect(page).to have_content "The page you were looking for doesn't exist."
end
end
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.