Dans mon programme Rails actuel, lorsque j'utilise quelque chose comme
user = User.find(10)
Quand il n'y a pas d'utilisateur avec ID = 10, j'aurai une exception comme:
ActiveRecord::RecordNotFound: Couldn't find User with ID=10
Puis-je obtenir nil au lieu de générer une exception alors, lorsque je fais quelque chose comme:
unless user = Challenge.find(10)
puts "some error msg"
end
Je veux juste avoir zéro quand il n'y a pas d'enregistrements et je ne veux pas utiliser begin/rescue
Merci
Oui, fais juste:
Challenge.find_by_id(10)
Pour les rails 4 et 5:
Challenge.find_by(id: 10)
Dans Rails 4, les outils de recherche dynamiques (tels que find_by_id
qui était utilisé dans la réponse acceptée) étaient obsolètes.
À l'avenir, vous devriez utiliser la nouvelle syntaxe:
Challenge.find_by id: 10
vous pouvez le faire un peu de hack, utilisez simplement l'interface de requête ActiveRecord.
cela retournera nil, au lieu de lever une exception
User.where(:id => 10).first
Pourquoi ne pas simplement attraper l'exception? Votre cas ressemble exactement à ce que des exceptions ont été faites pour:
begin
user = User.find(10)
rescue ActiveRecord::RecordNotFound
puts "some error msg"
end
Si vous souhaitez récupérer l'erreur dans le bloc de secours (par exemple, en définissant un utilisateur fictif (modèle null)), vous pouvez continuer avec votre code sous ce bloc. Sinon, vous pourriez simplement mettre tout votre code pour le "cas heureux" dans le bloc entre "commencer" et "porter secours".
Vous pouvez essayer ceci Challenge.exists?(10)
Pour ceux qui luttent avec mongoid, il s'avère que les méthodes find
et find_by
lèveront une exception - quelle que soit votre version de Rails!
Il existe une option (nommément raise_not_found_error) qui peut être définie sur false, mais lorsque la méthode find
est créée par falsey, elle ne génère pas non plus d'exception.
Ainsi, la solution pour les utilisateurs de mongoïdes est le code dégoûtant:
User.where(id: 'your_id').first # argghhh
aussi simple que:
user = User.find(10) rescue nil
Vous pouvez utiliser find_by avec l'attribut requis (dans votre cas, l'id). Cela retournera nil au lieu de donner une erreur si l'id donné n'est pas trouvé.
user = Challenge.find_by_id(id_value)
ou vous pouvez utiliser le nouveau format:
user = Challenge.find_by id: id_value
Vous pouvez également utiliser où, mais vous devez savoir que, où renvoyer une relation d’enregistrement actif avec zéro enregistrement ou plus, vous devez d’abord utiliser pour renvoyer un seul enregistrement ou nil si aucun enregistrement n’est renvoyé.
user = Challenge.where(id: id_value).first