Rails ha il concetto di Ambienti? per rappresentare gli stages del ciclo vitale di una applicazione (test, development, production di default). Gli errori sono gestiti appropriatamente per ogni livello di sviluppo. Gli ambienti di test e development forniscono una gestione degli errori utile allo sviluppatore, mentre l’ambiente production ritorna una pagina di errore con HTTP status 500 (Errore dell’applicazione).
ActionController::Rescue è il modulo che gestisce gli errori.
E’ possibile configurare la pagina di errore ritornata dalla nostra applicazione Rails, in modo globale o tramite un controller specifico. Combinando questi metodi si può avere una pagina di default, della quale si fa l’overriding in ogni controller per aver pagine specifiche.
Modificate il file /controller/application.rb:
def rescue_action_in_public(exception)
render :text => "<html><body><p>
Si è verificato un errore nel rispondere alla vostra richiesta.</p>
<!-- #{exception} --></body></html>"
end
def local_request?
false
end
Modificate il controller che volete che risponda agli errori in modo specifico implementando il metodo rescue_action_in_public:
def rescue_action_in_public(exception)
render :text => "<html><body>
<p>Si è verificato un errore gestito dal controller specifico nel rispondere alla vostra richiesta.</p>
<!-- #{exception} --></body></html>"
end
Questi esempi mostrano del testo semplice per le pagine di errore, ma ci sono molte altre possibilità (email, logging, redirects, ecc.) nel metodo rescue_action_in_public. (Si veda HowtoSendEmailWhenRailsThrowsAnException, per esempio).
Un’altra possibilità, invece di utilizzare del testo, è quella di fare il render di un template nel metodo rescue_action_in_public, per esempio:
def rescue_action_in_public(exception)
render :template => "controller/404"
end
Vedere HandlingPreControllerErrors.
consider_all_requests_local a falseMentre lavorate con questa funzionalità in locale avrete la necessità di assicurarvi che il vostro /config/environments/development.rb sia così settato:
config.action_controller.consider_all_requests_local = false
—-
Domanda: Ciò significa che non vi è una via semplice per definire la pagina di errore di default per un controller, una via che funzioni sia in development o in production o utilizzandola fuori da localhost?
Risposta: Questa via esiste. Ridefinendo il metodo rescue_action in application_controller.rb e questo verrà eseguito sia in development, production, su richiesta di un host remoto o da localhost. L’unica buona ragione per far questo è per mostrare un messaggio di errore più carino e specifico, assegnando il compito al metodo rescue_action_in_public. Mentre gli errori normalmente mostrati in development non sono attraenti, sono molto utili e contengono informazioni importanti per ritrovare errori nel codice.
—-
Ho scritto un piccolo tutorial riguardante “Come creare e gestire eccezioni in Ruby on Rails”: http://www.railsonwave.com/railsonwave/2007/1/19/howto-raise-and-rescue-exceptions-in-ruby-on-rails
—-
categoria: Howto
>> Traduzione di Paolo Sangregorio