117 votes

Rails : Pourquoi find(id) lève-t-il une exception dans Rails ?

Duplicata possible :
Model.find(1) donne une erreur ActiveRecord quand l'id 1 n'existe pas

S'il n'y a pas d'utilisateur avec un id de 1 dans la base de données, essayant User.find(1) soulèvera une exception.

Pourquoi ?

209voto

runako Points 4483

Parce que c'est la façon dont les architectes ont voulu que find(id) fonctionne, comme indiqué dans la RDoc :

Recherche par id - Il peut s'agir d'un id spécifique (1), d'une liste d'ids (1, 5, 6) ou d'un tableau d'ids ([5, 6, 10]). Si aucun enregistrement ne peut être trouvé pour tous les ids listés, alors RecordNotFound sera levé.

Si vous ne voulez pas que l'exception soit levée, utilisez find_by_id, qui retournera nil s'il ne peut pas trouver un objet avec l'id spécifié. Votre exemple serait alors User.find_by_id(1) .

-6voto

John Topley Points 58789

Suite à l'explication de runako, il est en fait très utile de pouvoir choisir si une exception est levée ou non. Je travaille sur une application de blog et je voulais ajouter la possibilité d'afficher l'entrée suivante ou précédente du blog. J'ai pu ajouter deux méthodes d'instance à mon application Post qui renvoient simplement nil lorsque vous essayez d'obtenir le message précédent en visualisant le premier message, ou le message suivant en visualisant le dernier message :

def next
  Post.find_by_id(id + 1)
end

def previous
  Post.find_by_id(id - 1)
end

Cela évite à mon code d'aide qui génère de manière conditionnelle les liens "Previous Post/Next Post" d'avoir à gérer l'attribut RecordNotFound ce qui serait mauvais car cela reviendrait à utiliser une exception pour le flux de contrôle.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X