2013 mise à jour pour Rails 3.2 de Jose Valim
Lorsque Rails 3.0 est sorti, l'une des fonctionnalités que les gens ont manqué soudainement était la possibilité de mieux gérer les exceptions. Le problème était le suivant: depuis que Rails 3 est devenu beaucoup plus «fluide», nous avons dû déplacer certaines fonctionnalités vers la pile middleware, ce qui nous a obligé à déplacer la gestion des exceptions. Rails 3.2 tente de ramener une certaine personnalisation au jeu en vous permettant de définir votre propre application en rack d'exception qui est invoquée lorsqu'une défaillance survient. Par exemple, vous pouvez définir l'application des exceptions à votre propre routeur dans votre config/application.rb:
config.exceptions_app = self.routes
Maintenant, chaque fois qu'il ya une exception, votre routeur va être invoqué. Par conséquent, pour rendre les pages personnalisées 404, vous pouvez simplement ajouter à votre routeur:
match "/404", :to => "errors#not_found"
et mettre en œuvre la logique du contrôleur que vous le souhaitez! Cependant, il y a quelques petites choses à garder à l'esprit si vous allez sur cette route:
- Vous devez utiliser correspondance dans vos itinéraires et ne pas obtenir/post/put/supprimer parce que ces exceptions peuvent se produire dans toute HTTP demande;
- Vous ne pourrez pas voir vos exceptions personnalisées dans le développement à moins que vous définissiez config.consider_all_requests_local sur false dans votre config/environments/development.rb.La raison en est que, si la requête est considérée comme locale, Rails favorisera toujours l'affichage de la page d'exceptions de débogage; [ou exécutez
rails server -e production
]
- Vous pouvez toujours accéder à l'exception d'origine dans le contrôleur à env ["action_dispatch.exception"];
- Il n'est pas possible de définir des cookies, la session ni le flash après une exception se produit. Ils ont tous déjà été remis en série au client ;
- Enfin, l'application des exceptions par défaut utilisée par Rails qui rend simplement une page en public/status.html est disponible ici: action_dispatch/middleware/public_exceptions.rb
Rappelez-vous que tout ce que vous faites dans les erreurs contrôleur, il ne devrait pas être quelque chose de "fantaisie". Restez simple car quelque chose s'est déjà mal passé avec votre application!