177 votes

Les différences entre .construire et .créer .créer ! et quand ils doivent être utilisés ?

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 ?

253voto

zenazn Points 8373

Il y a quelques différences, mais ils ne sont pas gros:

  1. .create est équivalent à .new suivie par .save. C'est juste plus succincte.
  2. .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
  3. 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.

37voto

nmott Points 4216

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.

6voto

rkj Points 2478

#create est une version plus courte de nouveau et enregistrer. #create ! jette exception si la validation n’a pas été positive.

5voto

Vineeth Points 1163

J’ai le deuxième les réponses ci-dessus. Plus pour , on ne peut pas passer comme argument que vous pouvez faire avec . En passant comme un argument ignorera toutes les validations de rails

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X