2013 mise à jour pour les Rails 3.2 de Jose Valim
Lors de Rails 3.0, l'une des caractéristiques qui, d'un seul coup manqué a la capacité de mieux gérer les exceptions. La question est: depuis Rails 3 est devenu beaucoup plus de Rack "fluent", nous avons eu à déplacer certaines caractéristiques de la pile de middleware et cela nous a obligés à déplacer l'ensemble de la gestion des exceptions, ainsi. Rails 3.2 tente d'apporter un certain degré de personnalisation de retour au jeu en vous permettant de définir vos propres exceptions application de rack qui est appelée lorsqu'une défaillance se produit. Par exemple, vous pouvez définir les exceptions de l'application à votre propre routeur dans votre config/application.rb:
config.exceptions_app = self.routes
Désormais, à chaque fois il y a une exception, votre routeur va être invoquée. Par conséquent, pour rendre les pages d'erreur 404 personnalisées, vous pouvez simplement ajouter à votre routeur:
match "/404", :to => "errors#not_found"
Et de mettre en œuvre la logique du contrôleur que vous le souhaitez! Cependant, il ya quelques choses à garder à l'esprit si vous allez en bas de cette route:
- Vous devez utiliser la correspondance dans vos itinéraires et pas get/post/put/delete
parce que de telles exceptions peuvent se produire dans toute requête HTTP;
- Vous ne serez pas en mesure de voir votre personnalisé exceptions dans le développement
sauf si vous définissez config.consider_all_requests_local à false dans votre
config/environments/développement.rb. La raison en est que, si la demande est
considéré comme local, Rails privilégie toujours à montrer le débogage
page des exceptions; [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 de session, ni le flash après
une exception se produit. Ils étaient tous déjà sérialisé retour à la
client;
- Enfin, la valeur par défaut exceptions application utilisée par les Rails
simplement rend une page dans public/STATUS.html est disponible ici:
action_dispatch/middleware/public_exceptions.rb
Rappelez-vous que quoi que vous fassiez dans les erreurs du contrôleur, il ne devrait pas être quelque chose de "fantaisie". Garder les choses simples parce que quelque chose allait déjà mal avec votre application!