77 votes

Rails: Pourquoi a-t find(id) de soulever une exception dans les rails?

Double Possible:
De modèle.trouver(1) donne ActiveRecord erreur lors de l'id 1 n'existe pas

Si il n'y a pas d'utilisateur avec l'id 1 dans la base de données, en essayant User.find(1) génère une exception.

Pourquoi est-ce?

146voto

runako Points 4483

Parce que c'est la façon dont les architectes ont prévu find(id) de travail, comme indiqué dans le RDoc:

Recherche par id - Ce peut être un id spécifique (1), une liste d'id (1, 5, 6), ou un tableau d'id ([5, 6, 10]). Si aucun enregistrement ne peut être trouvée pour l'ensemble de la liste des id, puis RecordNotFound sera soulevée.

Si vous ne voulez pas que l'exception soulevée, utiliser find_by_id, qui sera de retour nul si il ne peut pas trouver un objet avec l'id spécifié. Votre exemple serait alors User.find_by_id(1).

-3voto

John Topley Points 58789

Suite à runako de l'explication, il est assez utile d'avoir le choix de décider si une exception est levée ou non. Je travaille sur une application de blog et je voulais ajouter le support pour l'affichage de la suivante ou à la précédente entrée de blog. J'ai pu ajouter deux méthodes d'instance de mon Post modèle que tout simplement retourner nil lorsque vous essayez d'obtenir le post précédent lors de la visualisation du premier post, ou le prochain post lors de l'affichage du dernier message:

def next
  Post.find_by_id(id + 1)
end

def previous
  Post.find_by_id(id - 1)
end

Cela évite mon aide de code qui conditionnellement génère le Post Précédent/Suivant de Poster des liens de d'avoir à gérer de l' RecordNotFound d'exception, qui serait mauvaise, parce qu'elle serait l'aide d'une exception pour le contrôle de flux.

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: