J'ai donc été voir les personnes qui utilisent .build
, .create
et au .create!
sein de leurs contrôleurs de plus en plus ces derniers temps. Quelle est la différence entre simplement utiliser .new
et passer l'objet paramétré et ensuite .save
? Y a-t-il des avantages et des inconvénients? L'utilisation de ces autres méthodes offre-t-elle des avantages?
ruby-on-rails
Tim Knight
la source
la source
Bien qu'il soit correct que les
create
appelsnew
et puissave
il y a une grande différence entre les deux alternatives dans leurs valeurs de retour.Save
renvoie l'untrue
ou l' autrefalse
selon que l'objet a été enregistré avec succès dans la base de données ou non. Cela peut ensuite être utilisé pour le contrôle de flux selon le premier exemple de la question ci-dessus.Create
renverra le modèle, que l'objet ait été enregistré ou non. Cela a des implications pour le code ci-dessus en ce que la branche supérieure de l'if
instruction sera toujours exécutée même si l'objet échoue aux validations et n'est pas enregistré.Si vous utilisez
create
avec une logique de branchement, vous risquez des échecs silencieux, ce qui n'est pas le cas si vous utiliseznew
+save
.create!
ne souffre pas du même problème qu'il soulève et exception si l'enregistrement n'est pas valide.L'
create
alternative peut être utile dans les contrôleurs oùrespond_with
est utilisée pour les réponses API (JSON / XML). Dans ce cas, l'existence d'erreurs sur l'objet entraînera le renvoi des erreurs dans la réponse avec un statut deunprocessable_entity
, qui est exactement ce que vous attendez d'une API.J'utiliserais toujours l' option
new
+save
pour html, surtout si vous comptez sur la valeur de retour pour le contrôle de flux.la source
#create est une version plus courte de new and save. #créer! lève une exception si la validation n'était pas positive.
la source
Je seconderais les réponses ci-dessus. De plus
create
, on ne peut pas passerfalse
pour un argument avec lequel on peut fairesave
. Passerfalse
comme argument sautera toutes les validations de railsla source