raise ActiveRecord :: RecordNotFound (ou n'importe quel statut 404) pour une date invalide
Dans mon controller contrôleur, j'ai utiliser Date.new
pour créer un objet date, pour être passé dans mon ActiveRecord.
end_range = Date.new(params[:year].to_i, params[:month].to_i, params[:day].to_i).end_of_day.to_formatted_s(:db)
Le problème, c'est que si un utilisateur a essayé de changer les paramètres dans l'URL à la main, telles que la saisie de 40
pour la journée param, le Date.new
échoue (comme prévu). Cependant, je préfère ne pas avoir une erreur 500 si un utilisateur a tapé dans quelque chose comme ça, mais plutôt une erreur 404 (parce que vous ne jamais être en mesure d'un enregistrement avec un jour de 40
).
J'ai essayé plusieurs conditionnelles (if
et unless
consolidés) pour raise ActiveRecord::RecordNotFound
si cela échoue, mais elle renvoie l'erreur 500 avant l'exécution du conditionnel (et donc à ne jamais revenir sur une page 404).
Quelqu'un sait une meilleure façon de gérer cela, ou une façon de permettre à la Date.new
à l'échec avec plus de grâce, de sorte que l'instruction conditionnelle peut courir?
source d'informationauteur James Pierce
Vous devez vous connecter pour publier un commentaire.
Dans ce cas, vous pourriez sauver celui-ci, d'exception et de soulever un autre si vous souhaitez ré-carte des exceptions qui ne sont pas gérées dans le genre qui sont:
Il pourrait être plus efficace de simplement rendre et ne parviennent pas tout de suite cependant.
Vous pouvez aussi le faire dans un plus large sens à l'aide de la
rescue_from
méthode de ApplicationController:Je pense qu'il fait plus de sens pour sauver une date non valide erreur avec un message utile. C'est un problème courant lorsque les gens de choisir 30 février par exemple. Je préfère les renvoyer à la forme en question et leur dire pourquoi ils sont envoyés en arrière. Une 404 serait faux dans la plupart des cas, étant donné que l'erreur n'est pas valide la saisie de l'utilisateur, pas une URL non valide.
De plus, si vous sauver tous
ArgumentError
s alors vous ne serez pas averti du code des bogues. Donc, si ce n'est pas une erreur de date, puis je suis re-faire d'erreur. Malheureusement, nous devons changer le type d'exception pour éviter une boucle.Je l'ai mis dans le application_controller: