web-dev-qa-db-fra.com

Rails - créez et créez! Méthodes, Tutoriel RoR 3

Je sais donc que la distinction entre les méthodes bang (point d'exclamation) et non-bang est généralement de savoir si la méthode modifiera l'objet lui-même ou retournera un objet modifié séparé en gardant l'original inchangé.

Puis, lors de la construction du modèle utilisateur dans le chapitre 6 du livre, je suis tombé sur le User.create, qui crée un nouveau modèle et l'enregistre dans la base de données en une seule étape. Dans Michael Hartl Ruby on Rails 3 Tutorial , il écrit que le User.create! method "fonctionne exactement comme la méthode create ... sauf qu'elle déclenche une exception ActiveRecord :: Record-Invalid si la création échoue."

Je suis assez confus. Est le User.create! méthode ne suivant pas Ruby "bang-convention" ou est-ce que je manque complètement quelque chose? Et s'il IS suit la convention, comment User.create! se modifier si c'est une méthode de classe?

37
Kvass

Bien que beaucoup de classes traitent les méthodes bang comme "une méthode qui modifie l'objet en place", j'aime mieux la description des méthodes bang du Eloquent Ruby book :

En pratique, les programmeurs Ruby réservent! Pour orner les noms des méthodes qui font quelque chose d'inattendu, ou peut-être un peu dangereux

Ainsi, dans ce cas, le résultat "inattendu" est qu'une exception est déclenchée au lieu de simplement échouer et renvoyer false.

67
Dylan Markow

J'espère que cela vous aidera aussi:

Les versions bang (par exemple, save!) Déclenchent une exception si l'enregistrement n'est pas valide. Les versions non-bang ne le font pas: save et update_attributes retournent false, create et update renvoient juste les objets.

Source: http://edgeguides.rubyonrails.org/active_record_validations.html#when-does-validation-happen-questionmark

Edit: source modifiée pour réparer le lien cassé

14
KcC0