521 Stimmen

Wie man auf eine 404 in Rails umleiten?

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?

4voto

Arkadiusz Mazur Punkte 39
routes.rb
  get '*unmatched_route', to: 'main#not_found'

main_controller.rb
  def not_found
    render :file => "#{Rails.root}/public/404.html", :status => 404, :layout => false
  end

3voto

Ahmed Reza Punkte 293
<%= render file: 'public/404', status: 404, formats: [:html] %>

Fügen Sie dies einfach zu der Seite hinzu, die Sie zur 404-Fehlerseite machen wollen, und Sie sind fertig.

1voto

emptywalls Punkte 1187

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

1voto

Mark G. Punkte 3076

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:

  1. Es fügt sich in die bestehende Fehlerbehandlungs-Middleware ein wie eine normale ActionController::RoutingError , aber in Entwicklungsumgebungen erhalten Sie eine aussagekräftigere Fehlermeldung
  2. Der Status wird korrekt auf das gesetzt, was Sie im Hash rescue_responses angeben (in diesem Fall 404 - not_found)
  3. Sie müssen keine not_found Methode, die überall verfügbar sein muss.

0voto

Marek Příhoda Punkte 10858

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.com

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.

Powered by:

X