Rails Québec

mercredi, juin 21, 2006

SystemStackError: stack level too deep

Je suis tombé sur une erreur étrange aujourd'hui.

J'ai créé plusieurs routes dont l'une avait la structure suivante:

monsite.com/environment

Pour une raison que j'ignore, cet route génère un SystemStackError:

SystemStackError: stack level too deep

Encore pire, lorsque cette erreur apparaît, mon application ne fonctionne plus. Il faut redémarrer apache !

Par contre, si je fais cette modification, il n'y a plus d'erreur:

monsite.com/the_environment

J'en conclu donc pour le moment que certains mots peuvent
générer des conflits lorsqu'ils sont utilisés dans une route. Pour l'instant 'environment' est le seul que j'ai trouvé.

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

lundi, avril 10, 2006

component_request?

La version 1.1.1 offre une option intéressante que j'attendais depuis un bout de temps, soit la possibilité de vérifier si l'action exécutée fait parti d'un component.:
component_request?

Pratique lorqu'on veut prévenir l'exécution d'un bloc de code présent dans le controller d'application. Par exemple, pour éviter qu'un cookie soit envoyé chaque fois qu'un component est appellé, on peut utiliser le test suivant:

if !component_request?
# don't send cookies for component requests
cookies[:locale] = {:value => @locale,
:expires => Time.now + 3600*24*365}
end

vendredi, avril 07, 2006

Bienvenue

Je suis un développeur de Montréal/Québec et j'ai décidé de partir ce blogue pour discuter de Ruby on Rails en français.

À venir: des découvertes, trucs et astuces.