Catch Inconnu dans Rails 3 pour 404 personnalisée
Je veux attraper inconnu erreur dans Rails 3, qui illustre "Inconnu" erreur sur le développement et la 404.html sur la production. J'ai essayé de mettre ce rescue_from
gestionnaire sur mon ApplicationController (et aussi sur un contrôleur, juste au cas où) mais je vois encore le vilain erreur.
J'ai coutume de choses sur la 404, et il ne peut pas être simple .fichier html.
Mon itinéraire:
match '/user/:id/:action', controller: 'users'
L'URL je suis accès: /user/elado/xxx
La rescue_from
code:
rescue_from AbstractController::ActionNotFound, :with => :action_not_found
def action_not_found
render text: "action_not_found"
end
L'erreur dans le navigateur:
Unknown action
The action 'xxx' could not be found for UsersController
Et dans la console:
Started GET "/user/elado/xxx" for 127.0.0.1 at 2011-09-07 19:16:27 -0700
AbstractController::ActionNotFound (The action 'xxx' could not be found for UsersController):
Essayé aussi rescue_from ActionController::UnknownAction
.
Des suggestions?
Merci!
OriginalL'auteur elado | 2011-09-08
Vous devez vous connecter pour publier un commentaire.
rescue_from a été légèrement cassé lors de Rails 3 est sorti (encore cassé en 3.1). Fondamentalement, vous ne pouvez pas:
plus. Voir ici.
La solution, pour l'instant, est ce que hamiltop recommande. Utiliser un fourre-tout route qui va à votre "erreur d'aiguillage" de l'itinéraire. Assurez-vous de le mettre à la fin de votre config\itinéraires.rb fichier de sorte qu'il est traité en dernier.
Remarque: Cette méthode a un inconvénient majeur. Si vous utilisez un moteur comme Jammit ou de Concevoir les attraper tous route va faire des Rails ignorer les routes de l'engine.
Si vous n'êtes pas à l'aide d'un moteur qui a ses propres routes, alors vous devriez être bien.
Toutefois, si vous utilisez un moteur qui définit ses propres itinéraires de voir @arikfr de réponse.
OriginalL'auteur Seth Jackson
En utilisant un fourre-tout de l'itinéraire pour gérer des erreurs 404 (comme @Seth Jackson suggéré) a un inconvénient majeur: si vous utilisez l'un des Rails de moteurs de définir leurs propres itinéraires (comme Jammit) leurs itinéraires seront ignorés.
Mieux et plus conformes à la solution serait d'utiliser un middleware Rack qui va attraper les erreurs 404. Dans un de mes projets, j'ai mis en œuvre ce type de middleware Rack que les rapports de ces erreurs pour Hoptoad. J'ai basé mon application sur celui-ci: https://github.com/vidibus/vidibus-routing_error, mais au lieu d'invoquer mon application Rails de nouveau à la poignée de l'erreur 404, je le fais dans le middleware Rack et laissez nginx pour afficher la page d'erreur 404.
OriginalL'auteur arikfr
Si vous voulez vraiment de sauvetage
AbstractController::ActionNotFound
dans un contrôleur, vous pouvez essayer quelque chose comme ceci:Il remplace le
process
méthode deAbstractController::Base
que soulèveAbstractController::ActionNotFound
(voir source).OriginalL'auteur Grégoire Clermont
Avez-vous essayé un fourre-tout de l'itinéraire?
http://railscasts.com/episodes/46-catch-all-route
Le générique de l'itinéraire que vous sont en cours d'utilisation est une Mauvaise Idée(tm).
Je vous recommandons de définir la route que vous aimez, et ensuite de faire un fourre-tout comme la dernière ligne de routes.rb (les itinéraires définis en premier dans les itinéraires.rb trump plus tard, les définitions). Ensuite, vous pouvez rendre quelle que soit la page que vous voulez (et indiquez le code d'état 404).
Edit: Si vous voulez vraiment utiliser votre approche... (bien que cela semble comme il pourrait être obsolète)
def rescue_action(exception)
cas d'exception
lorsque ActionNotFound, UnknownAction alors
# Gérer ces exceptions ici
d'autre
super
fin
fin
rescue_from
? Il semble que ça devrait fonctionner...Merci, si
def rescue_action(exception); case exception; when ActionController::UnknownAction, AbstractController::ActionNotFound then render text: "404"; else render text: "other exception"; end; end
dans ApplicationController ou UsersController n'a pas fonctionné.OriginalL'auteur hamiltop