2009-06-03 8 views

Antwort

6

Überprüfen Sie Henrik Nyh's post aus. Andere können auch über Google gefunden werden.

Die Idee dahinter: Rails scheint public/404.html für 404-Fehler zu rendern.

  • Sie könnten dann die Seite überschreiben, wenn Sie
  • Für dynamische Inhalte ein statisches Feld angezeigt werden soll, es scheint, dass Sie einen Rahmen-Methode überschreiben können Haken in und leiten Ihre dynamische Seite zu machen.

ActionController::Rescue definiert eine rescue_action_in_public die render_optional_error_file nennt.

+8

Nicht Schienen 3 freundlich – AnApprentice

+1

@AnApp könnte .. es ist eine alte Antwort - Sie könnten die Rails 3-Version als separate Antwort veröffentlichen. – Gishu

+4

Was ist die Rails 3 Version? –

9

fügen Sie einfach das folgende in der Application:

rescue_from ActiveRecord::RecordNotFound, :with => :render_record_not_found 

    # Catch record not found for Active Record 
    def render_record_not_found 
    render :template => "shared/catchmissingpage", :layout => false, :status => 404 
    end 

    # Catches any missing methods and calls the general render_missing_page method 
    def method_missing(*args) 
    render_missing_page # calls my common 404 rendering method 
    end 

    # General method to render a 404 
    def render_missing_page 
    render :template => "shared/catchmissingpage", :layout => false, :status => 404 
    end 

Sie den Anruf machen anpassen können (die Vorlagen verwenden, verwenden Sie ein Layout etc.) und fangen Fehler auf diese Weise. Jetzt fängt es fehlende Methode und record_not_found für Sie auf, aber vielleicht gibt es Fälle, in denen Sie eine 500 Error-Seite anzeigen möchten, so dass Sie einfach weitermachen können, verwenden Sie diesen Ansatz und machen Sie es für Sie fit.

Zum Testen von einem lokalen Rechner funktioniert es einfach so. Wenn Sie nur wollen, dass es im Produktionsmodus funktioniert, fügen Sie eine

if ENV['RAILS_ENV'] == 'production' 

hinzu und alles ist in Ordnung.

+0

Auf Rails 3.1 funktioniert das nicht für mich für allgemeine 404 Seiten, nur für Datensätze nicht gefunden. Stattdessen zieht es weiter aus public/404.html und wenn diese Datei fehlt, wird nur eine leere Seite gerendert. –

3

Wenn Sie eine dynamische 404 (oder ein anderer Statuscode) Seite müssen Sie die entsprechende HTML-Datei von /public erstellen entscheiden entfernen (falls vorhanden)

13

ich auf ein paar Blog-Posts auf Google sah, wie um dies zu tun, scheinen die meisten leider darauf angewiesen zu sein, Ihren ApplicationController zu verschmutzen.

Was ich tat, war stattdessen eine Vorlage mit der 404-Nachricht zu erstellen dann diese Vorlage verwenden, um die Öffentlichkeit/404.html Datei von einer Rake Aufgabe zu aktualisieren:

# Rake file to generate static 404 page 

file "public/404.html" => ["app/views/layouts/application.html.erb"] do |t| 
    print "Updating 404 page\n" 
    `curl --silent http://locahost/content/error404 -o public/404.html` 
end 

Nun, wenn ich mein globales Layout aktualisieren, um die Die 404-Seite wird automatisch aktualisiert.

1

Auf der Testseite, ein wirklich guter Weg, dies zu tun (zumindest für Entwicklungszwecke) ist die Verwendung von Passenger und die Einstellung der Schienenumgebung zur Produktion (oder Kommentar "RailsEnv Entwicklung" in der Site-Konfiguration). Zumindest können Sie so nachahmen, wie es in der Produktion funktioniert.

Aber um dies zu tun, habe ich eine Vielzahl von Einstellungsdateien, die beim Start analysiert werden und abhängig von der Umgebung abgeholt werden. Eine der Einstellungen ist, ob Fehlerseiten angezeigt werden sollen (AppSettings.show_page_errors?).Da ist in meinem Application Controller, ich habe

if !AppSettings.show_page_errors? 
    alias_method :rescue_action_locally, :rescue_action_in_public 
    end 

So ist es im Allgemeinen auf die Standardeinstellungen gesetzt, aber manchmal brauche ich wirklich, um zu sehen, was genau los ist, also kann ich es auf die Produktion auszuschalten.

Der andere Schritt besteht darin, benutzerdefinierte Seiten zu verwenden. In meinem Fall habe ich Vorlagen basierend auf dem Fehler, die auch ein Formular enthalten, um an Google Formulare zu senden (da mein Server möglicherweise kaputt ist). Um dies zu erreichen, setzen diese (und nach Bedarf ändern) in der Application Controller:

def render_optional_error_file(status_code) 
    status = interpret_status(status_code) 
    render :template => "/errors/#{status.to_s[0,3]}.html.haml", :status => status, :layout => 'application.html.haml' if [404, 422, 500].include?(status) 
    render :template => "/errors/unknown.html.haml", :status => status, :layout => 'application.html.haml' unless [404, 422, 500].include?(status) 
end 

Dadurch wird die Statuscodes 404, 422 und 500 unter Verwendung der Schablone machen, aber sonst verwendet es unbekannt. Wenn Sie mit anderen umgehen müssen, müssen Sie nur diese Methode aktualisieren und die Vorlage hinzufügen.

Verwandte Themen