2009-06-03 11 views

Odpowiedz

6

Sprawdzić Henrik Nyh's post na zewnątrz. Inni też można znaleźć za pośrednictwem google.

Pomysł: Rails wydaje się renderować public/404.html dla błędów 404.

  • Następnie można zastąpić stronę, jeśli chcesz wyświetlić pola statycznego
  • Dla dynamicznej zawartości, wydaje się, można zastąpić metodę ramową, aby podłączyć i przekierować aby uczynić swoją stronę dynamiczną.

ActionController::Rescue definiuje rescue_action_in_public, który wywołuje render_optional_error_file.

+8

Nie szyny 3 przyjazne – AnApprentice

+1

@AnApp może być .. to stara odpowiedź - można opublikować wersję Rails 3 jako osobną odpowiedź. – Gishu

+4

Co to jest wersja Rails 3? –

9

wystarczy dodać następujące wpisy do ApplicationController:

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 

Można dostosować połączenia render (używać szablonów, należy układ itd.) I wyłapywanie błędów w ten sposób. Teraz łapie brakującą metodę i record_not_found dla ciebie, ale być może są przypadki, w których chcesz wyświetlić stronę błędu 500, abyś mógł po prostu iść do przodu, wykorzystywać to podejście i sprawić, by pasował do ciebie.

Do testowania z lokalnego komputera, po prostu działa tak. Jeśli chcesz, aby działał tylko w trybie produkcyjnym, dodaj nowy kod i uzyskasz poprawne wyniki.

+0

Na Rails 3.1 to nie działa dla mnie na ogólne 404 strony, tylko dla rekordów nie znaleziono. Zamiast tego ciągnie z publicznego/404.html i jeśli tego pliku brakuje, po prostu renderuje pustą stronę. –

3

Jeśli zdecydujesz się stworzyć dynamiczny 404 (lub inny kod statusu) Strona należy usunąć odpowiedni plik HTML z /public (jeśli istnieje)

13

Spojrzałem na kilku blogach w Google, w jaki sposób Aby to zrobić, niestety większość zdaje się polegać na zanieczyszczaniu twojego ApplicationController.

Co zrobiłem zamiast było stworzenie szablonu z komunikatem 404 następnie użyć tego szablonu, aby zaktualizować plik public/404.html z zadaniem natarcia:

# 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 

Teraz ilekroć zaktualizować globalny układ ten 404 strona zostanie automatycznie zaktualizowana.

1

Na froncie testowym, naprawdę dobrym sposobem na zrobienie tego (przynajmniej w celach programistycznych) jest wykorzystanie Pasażera i ustawienie środowiska railsowego do produkcji (lub skomentowanie "rozwoju RailsEnv" w konfiguracji strony). Przynajmniej w ten sposób można naśladować sposób jego działania w produkcji.

Jednak, aby to zrobić, mam wiele plików ustawień, które są analizowane podczas uruchamiania i są pobierane w zależności od środowiska. Jednym z ustawień jest wyświetlanie stron błędów (AppSettings.show_page_errors?).Wtedy w moim kontroler aplikacji, mam

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

tak, to na ogół zestaw do ustawień domyślnych, ale czasami naprawdę trzeba zobaczyć, co dokładnie się dzieje, więc mogę go wyłączyć na produkcji.

Kolejnym krokiem jest użycie niestandardowych stron. W moim przypadku mam szablony oparte na błędzie, które zawierają również formularz do przesłania do formularzy google (ponieważ mój serwer może być uszkodzony). Aby to zrobić, umieścić to (i zmienić w razie potrzeby) w kontroler aplikacji:

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 

To spowoduje, że kody stanu 404, 422 i 500 przy użyciu szablonu, ale poza tym to wykorzystuje nieznane. Jeśli potrzebujesz obsługiwać innych, to tylko kwestia aktualizacji tej metody i dodania szablonu.

Powiązane problemy