Une meilleure lisibilité des informations avec Better Errors

Publié le 26 juin 2013 par Alexandre Salaun | outils

Cet article est publié sous licence CC BY-NC-SA

Pendant le développement d’un site ou d’une application Rails, vous vous êtes sans doute déjà retrouvé à chercher dans les informations contenues sur la page d’erreur de Rails d’où provenait le souci. Ces pages sont très utiles car elles permettent d’obtenir un certain nombre d’éléments pour débugger mais il manque parfois certaines informations. La gem Better Errors, elle, rend les pages d’erreur plus lisibles et plus complètes.

Cette gem va donc remplacer les pages d’erreurs de Rails par des pages plus complètes et mieux structurées. Il sera possible d’y retrouver plus d’informations. De plus, grâce à une autre gem complémenatire vous pourrez avoir encore plus d’outils pour débugger.

Installation

Better Errors est utilisable à partir de la version 1.9.2 de Ruby (jusqu’à Ruby 2 inclus). JRuby et Rubinius sont également supportés.

Afin de pouvoir utiliser cette gem dans votre application Rails, il est nécessaire de l’ajouter au Gemfile :

group :development do
  gem 'better_errors'
end

La gem a été ajoutée dans le groupe development, nous verrons pourquoi par la suite.

Ensuite, vous pouvez finaliser l’installation via la commande bundle install. Après cela, la gem est utilisable.

Dans le cadre du développement d’une application Rails, vous n’avez rien de plus à faire. Les pages d’erreurs de Rails sont remplacées par les pages de Better Errors. Si vous n’utilisez pas Ruby On Rails, il est nécessaire d’ajouter Better Errors aux middlewares. Voici un exemple pour Sinatra :

require "sinatra"
require "better_errors"

configure :development do
  use BetterErrors::Middleware
  BetterErrors.application_root = __dir__
end

La configuration du répertoire racine n’est pas obligatoire, il permet juste de donner le chemin relatif des fichiers de l’application.

Afin d’obtenir encore plus d’informations, comme l’inspection des variables, la gem binding_of_caller est disponible. Il suffit de l’ajouter aussi au Gemfile de votre application.

group :development do
  gem 'better_errors'
  gem 'binding_of_caller'
end

Vous avez maintenant tous les éléments en place pour corriger au mieux les erreurs que vous rencontrez.

Utilisation

Lorsque vous avez une erreur sur la page web demandée, vous avez mantenant une page d’erreur générée par Better Errors et non plus la page d’erreur par défaut de Rails. Sur celle-ci vous pouvez consulter la stack correspondante et visualiser un aperçu de chaque fichier (le code utilisé est mis en valeur grâce à un effet de surbrillance).

Page d'erreur de Better Errors

Une console est également disponible. Les variables d’instances utilisées dans le fichier ouvert sont utilisables dans cette console.

Pour chaque fichier de la stack consulté, vous pouvez inspecter les variables d’instance et les variables locales. De plus, les valeurs gardées en session sont aussi visualisables.

De nombreuses informations sont donc disponibles afin de vous permettre de corriger au mieux l’erreur rencontrée.

Cependant, cet affichage n’est visible que pour une erreur provenant d’une vue HTML, il serait aussi intéressant d’avoir ces informations pour une erreur concernant une requête AJAX. Et bien c’est possible. En effet, vous pouvez consulter la page correspondant à la dernière erreur rencontrée en tapant dans votre barre d’url http://monsite.dev/__better_errors. De cette façon, vous avez accès à la page d’erreur quelque soit le type de requête, ce qui est bien plus pratique pour les requêtes AJAX que de consulter l’erreur dans l’outil de développement du navigateur.

Vous bénéficiez donc d’une plus grande lisibilité des messages d’erreur et d’outils favorisant le débuggage. Le développement ne devrait donc devenir que plus simple.

Sécurité

Le remplacement des pages d’erreurs de Rails par les pages de Better Errors est très utile en environnement de développement mais bien plus dangereux en production. En effet, les informations données sur ces pages peuvent être sensibles et des personnes mal intentionnées pourraient s’en servir pour tenter de pirater votre site.

La gem Better Errors est donc ajoutée au Gemfile de l’application uniquement dans le groupe development pour ne pas exposer ces pages dans d’autres environnement. De plus, ces pages d’erreurs ne sont accessibles que pour le localhost. Si vous développez sur un serveur distant ou dans une machine virtuelle vous verrez les pages d’erreurs par défaut de Rails et non celles de la gem.

Il est possible d’ajouter des IP qui pourront accèder aux pages d’erreurs de Better Errors afin de permettre le développement sur des serveurs distants. Pour cela, il faut ajouter la ligne suivante dans le fichier de configuration de l’environnement utilisé (en l’occurence development) :

# config/development.rb
BetterErrors::Middleware.allow_ip! ENV['TRUSTED_IP'] if ENV['TRUSTED_IP']

Ensuite, il suffit de lancer le serveur Rails via la commande suivante :

TRUSTED_IP=WW.XX.YY.ZZZ rails s # WW.XX.YY.ZZZ étant l'adresse IP souhaitée

Intégration avec un éditeur de texte

Il est possible, lorsque vous êtes sur un page d’erreurs, d’ouvrir un fichier dans votre éditeur de texte préféré à la ligne spécifié dans la stack d’erreurs. Pour cela, des applications sont disponibles pour différents éditeurs.

Vim

L’application Vim in iTerm est disponible pour OSX afin de permettre l’ouverture des fichiers dans Vim. Attention, il est obligatoire d’avoir auparavant installé iTerm.

Il faut télécharger le fichier ZIP de l’application. Ensuite, il suffit de dézipper le fichier et de placer le fichier Vim in Term dans le répertoire Applications. Il faut lancer une première fois l’applciation afin d’enrigstrer le URLScheme. L’application est donc maintenant présente et utilisable, il n’y a plus qu’à préciser à Better Errors d’utiliser celle-ci pour ouvrir les fichiers. Un initializer doit être ajouté pour cela :

# config/initializers/better_errors.rb
if defined? BetterErrors
  BetterErrors.editor = proc { |file, line| "viminiterm://open?url=file://#{file}&line=#{line}" }
end

Dorénavant, si vous cliquez sur le chemin d’un fichier dans la page d’erreur de Better Errors, ce dernier sera ouvert avec Vim dans iTerm. Lors de la première ouverture de fichier, OS X vous demandera une confirmation.

Sublime Text

Comme pour Vim, une application existe afin d’ouvrir les fichiers depuis les pages d’erreurs de Better Errors avec Sublime Text : SublHandler.

Il faut télécharger la dernière version de l’application puis la dézipper. Ensuite, il est nécessaire de lancer l’application une première fois afin de configurer le chemin du fichier binaire de Sublime Text. Pour cela, une fois l’application lancée, il faut aller dans les préférences et indiquer le chemin.

Ensuite, vous devez préciser à Better Errors que vous souhaitez utiliser Sublime Text 2.

# config/initializers/better_errors.rb
if defined? BetterErrors
  BetterErrors.editor = proc { |file, line| "subl://open?url=file://#{file}&line=#{line}" }
end

Il est possible d’utiliser d’autres éditeurs tels que TextMate par exemple ou encore des IDE comme RubyMine.

Conclusion

Better Errors permet donc, durant le développement d’une application ou d’un site web, d’avoir plus d’informations sur les erreurs rencontrées. Cela facilite le débuggage via les différents outils proposés tels que la console depuis la page d’erreur qui permet d’utiliser les variables du fichier sélectionné. L’intégration avec les éditeurs de texte est également une fonctionnalité intéressante.

Cela peut potentiellement représenter un gain en terme de productivité. Si vous utilisez Better Errors ou d’autres outils de ce type je suis intéressé par vos retours d’expériences.

L’équipe Synbioz.

Libres d’être ensemble.