Rails 3 - Comment ne Pas d'Erreur si aucun enregistrement n'est trouvé
Dans ma autorisations contrôleur, je l'Active record est de regarder pour une autorisation:
@permission = Permission.find(params[:user_id])
Si cela renvoie un résultat, je puis vérifier l'autorisation.le nom Et la transmettre à mon contrôleur.
Problème est que parfois, ce n'returna résultat, othertimes il ne le fait pas. Quand il n'est pas, il erreurs. Comment puis-je empêcher cela de se produire?
Cas D'Utilisation:
1. Si l'utilisateur dispose d'une autorisation d'enregistrer, de le montrer et de permettre à l'utilisateur de le changer
2. Si non, montrent qu'ils n'ont pas l'autorisation d'enregistrer et de permettre à l'utilisateur de définir une autorisation.
Grâce
Vous devez vous connecter pour publier un commentaire.
L'idée est que si vous utilisez le "premier paramètre est l'id de" version de la trouver, vous savez exactement ce que vous cherchez, et si elle n'est pas là, c'est un problème. Si vous utilisez l'un des plus générique finder syntaxes (comme find_by_field_name), l'hypothèse est que si elle n'est pas là, c'est une situation acceptable si juste de retour nul.
@permission = Permission.find_by(id: params[:user_id])
maintenant.Je sais que c'est vieux, mais je viens de trouver ceci et je veux suggérer une autre façon de gérer cette situation.
ActiveRecord::RecordNotFound
est rien à craindre. Un utilisateur peut passer dans un enregistrement valide id, mais que l'enregistrement ne peut pas appartenir à eux (c'est à dire si vous faites quelque chose commecurrent_user.widgets.find(params[:id])
). Je préfère gérer ça comme ceci:ActiveRecord#find
avec un paramètre de type int est ciblé trouver. Rails soulève RecordNotFound si l'enregistrement n'est pas trouvé.Ce qui est différent de l'aide de la recherche avec des paramètres comme
:first
ou:all
, qui est plus d'une recherche; les Rails retourne nil pour aucun des enregistrements dans ces cas. Si vous voulez éviter la levée d'une exception, utilisez l'une de ces options ou les noms de méthode.Exemple:
find_by_[column]
. Utiliser à la place (voir Matt Briggs réponse). Il pourrait être un peu plus lent en raisonmethod_missing
mais c'est plus intuitif.L'autre sens:
@permission = Permission.find_all_by_id params[:user_id]
Je pense que c'utiles si user_id est un tableau
find_all_by_*
sera obsolète dans les Rails 4.Je pense que cela va fonctionner, je n'ai pas testé.
ActiveRecord#find
avec un paramètre de type int est ciblé trouver. Rails soulèveRecordNotFound
si l'enregistrement n'est pas trouvé. C'est différent de l'utilisation defind
avec des paramètres comme:first
ou:all
, qui est plus d'une recherche; les Rails retourne nil pour aucun des enregistrements dans ces cas. (-1 pour des informations incorrectes et ne pas tester)