5

To jest mój pierwszy post tutaj, więc mam nadzieję, że umieszczam to pytanie we właściwym miejscu. W przeciwnym razie, proszę dać mi znać, aby wiedzieć, następnym razem, kiedy zamieszczam tutaj :)Ruby on Rails -HTTP error handling

Pracuję na stronie internetowej RoR i chciałbym obsługiwać błędy serwera (400, 404, 500, itp.) Indywidualnie. Ponieważ strona jest dynamiczna, chciałbym poradzić sobie z błędami w środowisku rails, a nie na poziomie serwera. Przykładem tego, co chciałbym zrobić, może być przedstawienie użytkownikowi materiału opcjonalnego lub paska wyszukiwania, gdy wpadnie na stronę lub szablon, który nie zostanie załadowany lub po prostu nie istnieje.

Jestem nowy w RoR, więc proszę o mnie proszę na wypadek, gdy pytam o oczywistość.

Tak, zrobiłem trochę czytania i myślę, że korzystanie z obsługi wyjątku rescue_from jest sposobem, aby przejść w moim przypadku. (Byłbym bardziej niż szczęśliwy, gdyby ktoś z was miał inne zdanie).

Mam proste prototyp (patrz kod poniżej) i działa, jednak pojawia się błąd, kiedy to następującą procedurę obsługi wyjątku do kodu:

rescue_from ActionController::MissingTemplate,   :with => :not_found #404 

Teraz nie widzę że mam błąd w pisowni i widziałem tę linię w kodzie opublikowanym w Internecie. Jednak, kiedy to mi się następujący błąd ułożenia:

Routing Error No route matches "/errorhandle" with {:method=>:get} 

pracuję na szynach 2.3.5, chyba że ma coś wspólnego z tym?

Mam nadzieję, że pomożesz mi rzucić trochę światła na tę kwestię.

Pozdrawiam! /Maja

class ApplicationController < ActionController::Base 

    helper :all # include all helpers, all the time 

    protect_from_forgery #See ActionController::RequestForgeryProtection for details 

    #ActiveRecord exceptions 
    rescue_from ActiveRecord::RecordNotFound, :with => :not_found #400 

    #ActiveResource exceptions 
    rescue_from ActiveResource::ResourceNotFound, :with => :not_found #404 

    #ActionView exceptions 
    rescue_from ActionView::TemplateError, :with => :not_found #500 

    #ActionController exceptions 
    rescue_from ActionController::RoutingError, :with => :not_found #404 

    rescue_from ActionController::UnknownController, :with => :not_found #404 

    rescue_from ActionController::MethodNotAllowed, :with => :not_found #405 

    rescue_from ActionController::InvalidAuthenticityToken, :with => :not_found #405 

    rescue_from ActionController::UnknownAction, :with => :not_found #501 

    # This particular exception causes all the rest to fail.... why? 
    # rescue_from ActionController::MissingTemplate, :with => :not_found #404 

    protected 
    def not_found 
     render :text => "Error", :status => 404 
    end 

    # Scrub sensitive parameters from your log 
    # filter_parameter_logging :password 
end 
+1

Czy możesz pokazać nam odpowiednie trasy z routes.rb, jeśli w ogóle? – Trevoke

+0

Pewnie Trevoke, dzięki za szybką odpowiedź. Nie dodałem nic do routes.rb, więc domyślam się, że to prawie std. plik: ActionController :: Routing :: Routes.draw do | map | map.resources: errorhandlers # ... # działki linii komentowane się # ... map.connect ': regulator /: action /: id' map.connect „: kontroler /: action/: id.: format " koniec –

+0

uh, nie wiem jak sprawić, by komentarz wyglądał ładnie i porządnie * uark *. Mam nadzieję, że da się je odczytać ... –

Odpowiedz

2

Weźmy okiem na te: http://www.ruby-forum.com/topic/47898

http://henrik.nyh.se/2008/09/404-invalid-rails-format

W szczególności stanowisko w pierwszym linku:

You can't use a regular 'rescue' keyword to rescue MissingTemplate exception.

Use rescue_action instead, for example:

def rescue_action(exception) 
    if ::ActionController::MissingTemplate === exception 
    render :text => 'rescued' 
    else 
    super 
    end 
end 

Kent.

+0

Dziękuję bardzo Kent za odpowiedź i linki, wszystkie były bardzo pomocne.Przeczytam o :: i ogólnej obsłudze wyjątków w RoR, aby lepiej zrozumieć twoją odpowiedź. ... a potem mógłbym zadać jeszcze kilka pytań, jeśli nie masz nic przeciwko? Na razie - dzięki wam wszystkim, wspaniale jest być częścią tak aktywnego forum! /Maja –

+0

Nie jestem Kentem - Kent odpowiedział na to pytanie w pierwszym linku :-) Nie ma za co. Za wszelką cenę, zadaj więcej pytań, na to właśnie jest ta strona! (po prostu przeczytaj najpierw dokument, oczywiście). – Trevoke