Vous pouvez, en Ruby, comme avec tout langage évolué, générer et gérer des exceptions.
Exemple rapide :
begin
raise "Only a test"
rescue
# Le raise nous emmene ici
end
Ainsi, nous pouvons aisément gérer les erreurs générées par notre application et éviter de tout casser pour un simple enregistrement non trouvé dans la base de données.
Tous vos modèles et vos contrôleurs dans Rails pourront soulever des exceptionset elles seront gêrées par l’application.
Ainsi si, dans votre contrôleur, vous avez :
Post.find params[:id]
Et que l’uplet ayant pour clé primaire params[:id] n’existe pas, une exception ActiveRecord::RecordNotFound sera soulevée.
En développement vous verrez un beau message d’erreur et en production une belle erreur 500.
Mais nous ne voulons pas de cette erreur 500. Si l’enregistrement ne peut pas être trouvé, cela signifie que la page n’existe pas et alors, on désire une erreur 404.
En Ruby pur, nous ferions donc :
begin
Post.find params[:id]
rescue ActiveRecord::RecordNotFound
# On affiche l'erreur 404
end
Vade retro beurk !
Rendons nous plutôt dans application_controller et utilisons rescue_from (ou dans rails 3).
Nous allons donc avoir, dans ApplicationController :
rescue_from ActiveRecord::RecordNotFound, :with => :render_missing
def render_missing
render :file => "#{RAILS_ROOT}/public/404.html", :status => 404
end
Rails s’occupe de faire l’appel à cette méthode lorsque l’exception est soulevée et nous avons bien notre erreur 404 générée
Bien évidemment, vous pouvez gérez n’importe quelle exception avec rescue_from et ainsi éviter les erreurs 500 pas jolies et qui anéantissent l’expérience utilisateur afin de les remplacer par des joli messages.
Attention cependant à ne pas partir dans des excès ! En voici typiquement un.
Ok pour gérer les exceptions dans le contrôleur lorsqu’elles ont un impact direct sur l’utilisateur (service indisponible, erreur 404, …).
Mais pas pour gérer toutes les erreurs comme ceci.
Ne vous amusez donc pas à utiliser rescue_from afin de gérer les enregistrements invalides. Travaillez intelligemment




