Les différences entre .build, .create et .create! et quand devraient-ils être utilisés?

J’ai donc vu des gens utiliser .build, .create et .create! au sein de leurs contrôleurs de plus en plus récemment. Quelle est la différence entre simplement utiliser .new et passig l’object param’d 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?

Il y a quelques différences, mais elles ne sont pas grandes:

  1. .create est équivalent à .new suivi de .save . C’est juste plus succinct.
  2. .create! est équivalent à .new suivi de .save! (renvoie une erreur si la sauvegarde échoue). C’est aussi juste un petit peu plus court
  3. Je pense que .build est surtout un alias pour .new . Il fonctionne d’une manière dans Rails 3 et d’une autre manière dans Rails <3.x

La partie la plus importante est que ces méthodes peuvent être appelées via une association ( has_many , etc.) pour lier automatiquement les deux modèles.

Bien qu’il soit correct de create new appels, puis de save il existe une grande différence entre les deux alternatives dans leurs valeurs de retour.

Save renvoie true ou false selon que l’object a été enregistré avec succès dans la firebase database ou non. Cela peut ensuite être utilisé pour le contrôle de stream selon le premier exemple de la question ci-dessus.

Create renvoie le modèle, que l’object ait été enregistré ou non. Cela a des implications pour le code ci-dessus en ce que la twig supérieure de l’instruction if sera toujours exécutée même si l’object échoue aux validations et n’est pas enregistré.

Si vous utilisez create avec la logique de twigment, vous risquez des défaillances silencieuses, ce 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 exception si l’enregistrement est invalide.

L’alternative create peut être utile dans les contrôleurs où respond_with est utilisé pour les réponses API (JSON / XML). Dans ce cas, l’existence d’erreurs sur l’object provoquera le retour des erreurs dans la réponse avec un statut de unprocessable_entity , ce qui est exactement ce que vous voulez à partir d’une API.

J’utiliserais toujours la new option + save pour html, surtout si vous utilisez la valeur de retour pour le contrôle de stream.

#create est une version plus courte de new et save. #créer! lance une exception si la validation n’était pas positive.

J’appuie les réponses ci-dessus. De plus pour create , on ne peut pas passer de false comme argument que vous pouvez faire avec save . Passer un argument false en ignorant toutes les validations de rails