Y a-t-il un moyen de remplacer la page d'erreur sans défaut de sinatra ("Sinatra ne connaît pas ce ditty")? Je veux que Sinatra ne montre que une chaîne ordinaire comme "méthode non trouvée" lorsqu'il n'a pas trouvé la voie appropriée, mais lorsque je soulevais une erreur 404 de l'intérieur d'un itinéraire, je souhaite qu'il affiche le message d'erreur transmis.
Implémentation du bloc Not_found comme ceci: p>
get '/' do begin # some processing that can raise an exception if resource not found rescue => e error 404, e.message.to_json end end
3 Réponses :
Si vous n'utilisez pas de manipulation des erreurs dans votre itinéraire, vous pouvez utiliser l'erreur Il y a un paramètre Erreur intégrée CODE> comme ceci (prise et modifiée à partir du SINATRA: up and exécuté livre)
capture code > qui tient votre erreur. Vous pouvez y accéder via
paramètres ['captures'] code>. C'est un tableau et dans mes tests, il contiendrait un seul élément, qui était l'erreur elle-même (pas une chaîne). P>
Je fonctionne, mais pas pour des itinéraires inégalés, donc si j'ai une application Sinatra comme celle que vous avez postée et essayez d'atteindre par exemple / this_is_not_a_present_route code> Je vois toujours la page de sinatra par défaut au lieu du message d'erreur.
Donc, si vous avez une demande d'itinéraire inexistante, utilisez l'itinéraire no_found code>. Dans l'objet de la demande, il y a
demande.path code> qui vous donnerait
'this_is_not_a_present_route' code> dans votre exemple. J'ai mis à jour l'exemple aussi.
Bonjour, le problème est de ne pas remplacer les autres messages d'erreur 404 élevés des itinéraires intérieurs. De cette façon, il présentera toujours la requête.Path Si vous essayez d'atteindre un itinéraire non implémenté, mais vous le montrerez si une erreur 404 est relevée des itinéraires intérieurs.
Si vous soulevez une erreur de l'intérieur d'un itinéraire, vous ne devez pas renvoyer un 404, vous devez renvoyer un 500 ou même 503. 404 est pour le moment où l'URI demandée n'est pas trouvée.
Dans l'exemple, params ['captures'] code> ne contient pas d'exceptions ni de messages d'erreur. Il est renseigné avec les captures d'expression régulières s'ils sont spécifiés dans le chemin (c'est-à-dire
obtenir% r {/ id / (\ d +)} dactez code>). Donc, cette réponse est hors base. Utilisez
env ['sinatra.error'] code> pour accéder à l'objet d'exception.
Nevermind, a constaté que toutes les routes sont assorties dans l'ordre. Ainsi, après toutes les routes, je mets get / post / delete '*' '' '' fin code> et qui résout mon problème. P>
Peut-être une solution plus gracieuse que celle proposée dans La réponse acceptée a > est de sauver seulement sinatra :: Notlound code>, plutôt que d'utiliser l'erreur
Erreur (404) code> ou
Not_found code> styles.
error Sinatra::NotFound do
content_type 'text/plain'
[404, 'Not Found']
end