Rails Québec

mardi, avril 18, 2006

Recevoir des rapports d'erreurs par courriel

Une façon pratique d'être informé lorsqu'une erreur critique survient est d'utiliser la fonction rescue_action_in_public. Cette fonction est exécutée automatiquement lorsqu'une exception est détectée.

On peut la placer dans n'importe quel controlleur ou simplement la définir globalement dans le controlleur d'application.

La fonction peut être modifiée afin qu'elle envoi un courriel lorsqu'une erreur critique survient. Le livre Agile Web Development with Rails contient un exemple intéressant:

def rescue_action_in_public(exception)
case exception
when ActiveRecord::RecordNotFound, ActionController::UnknownAction
render(:file => "#{RAILS_ROOT}/public/404.html",
:status => "404 Not Found")
else
render(:file => "#{RAILS_ROOT}/public/500.html",
:status => "500 Error")
SystemNotifier.deliver_exception_notification(
self, request, exception)
end
end
end
Malheureusement ce code me retourne l'erreur suivante sur mon serveur de développement (Ruby 1.8.4, Rails 1.1.2):
uninitialized constant UnknownAction
Je me suis rendu compte que Rails utilise le chemin invalide suivant...
ActionWebService::Dispatcher::ActionController::UnknownAction
alors que UnknownAction se trouve dans ....
ActionController::UnknownAction
En cherchant un peu, j'ai trouvé ce message qui suggère de remplacer ActionController::UnknownAction par ::ActionController::UnknownAction.

Ça fonctionne. Maintenant Rails cherche la classe UnknownAction dans le bon chemin, soit ActionController::UnknownAction. Sauf qu'au niveau de la syntaxe, je ne suis pas encore certain de comprendre la différence entre ...
ActionController::UnknownAction
.. et ..
::ActionController::UnknownAction