Donc j’ai été voir les personnes qui utilisent .construire et .créer .créer ! au sein de leurs contrôleurs de plus en plus ces derniers temps. Quelle est la différence en faisant juste .new et passig que le param s’opposerait, puis .sauf ? Y a-t-il des avantages et des inconvénients ? En utilisant ces autres méthodes offre avantages ?
Réponses
Trop de publicités?Il y a quelques différences, mais ils ne sont pas gros:
-
.create
est équivalent à.new
suivie par.save
. C'est juste plus succincte. -
.create!
est équivalent à.new
suivie par.save!
() lève une erreur si l'enregistrement échoue). Il est également juste un tout petit peu plus courte - Je pense que
.build
est principalement un alias pour.new
. Il fonctionne d'une manière en Rails 3 et d'une autre manière dans les Rails < 3.x
La partie la plus importante, toutefois, est que ces méthodes peuvent être appelées par le biais d'une association (has_many
, etc.) automatiquement le lien entre les deux modèles.
Bien qu'il soit exact que create
des appels new
puis save
il y a une grande différence entre les deux variantes dans leurs valeurs de retour.
Save
retourne true
ou false
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 comme pour le premier exemple dans la question ci-dessus.
Create
sera de retour le modèle indépendamment de savoir si l'objet a été enregistré ou non. Ceci a des implications pour le code ci-dessus dans le haut de la branche de l' if
déclaration sera toujours exécutée même si l'objet ne parvient pas validations et n'est pas enregistré.
Si vous utilisez create
avec la logique vous êtes à risque de le silence des échecs, qui n'est pas le cas si vous utilisez new
+ save
.
create!
ne souffre pas du même problème qu'il soulève et une exception si l'enregistrement n'est pas valide.
L' create
alternative peut être utile dans les contrôleurs où respond_with
est utilisé pour l'API (JSON/XML) des réponses. Dans ce cas, l'existence d'erreurs sur l'objet provoquer des erreurs pour être renvoyé dans la réponse avec un statut d' unprocessable_entity
, ce qui est exactement ce que vous voulez à partir d'une API.
Je serais toujours utiliser l' new
+ save
option pour le html, surtout si vous êtes en s'appuyant sur la valeur de retour de contrôle de flux.