web-dev-qa-db-fra.com

Rails new vs create

Pourquoi est-il nécessaire de définir une nouvelle méthode dans le contrôleur RESTful, de la suivre avec une méthode create?

La recherche Google ne m'a pas fourni la réponse que je cherchais. Je comprends la différence, mais j'ai besoin de savoir pourquoi ils sont utilisés comme ils sont.

190
sent-hil

L'implémentation dans Rails de REST new et create sont traités différemment.

Un HTTP GET to /resources/new est destiné à rendre un formulaire adapté à la création d'une nouvelle ressource, en appelant l'action new dans le contrôleur, ce qui crée un nouvel enregistrement non sauvegardé et restitue le formulaire.

Un HTTP POST à /resources prend l’enregistrement créé dans le cadre de l’action new et le transmet à l’action create du contrôleur, qui tente ensuite de l’enregistrer dans la base de données.

252
Steve Weet

Dans la documentation ActiveRecord :: Base :

create (attributs = nil) {| object | ...}

Crée un objet (ou plusieurs objets) et l’enregistre dans la base de données si les validations aboutissent. L'objet résultant est renvoyé, que l'objet ait été correctement enregistré ou non dans la base de données.

new (attributs = nil) {| self si block_given? | ...}

Les nouveaux objets peuvent être instanciés comme vides (passer aucun paramètre de construction) ou prédéfinis avec des attributs mais pas encore enregistrés (passer un hachage avec des noms de clé correspondant aux noms de colonne de la table associée). Dans les deux cas, les clés d’attribut valides sont déterminées par les noms de colonne de la table associée. Par conséquent, vous ne pouvez pas avoir d’attributs qui ne font pas partie des colonnes de la table.

Donc, create instancie le nouvel objet, le valide, puis l’enregistre dans la base de données. Et new crée uniquement l'objet local mais ne tente pas de le valider ni de l'enregistrer dans la base de données.

242
Justin Ethier

New instancie une nouvelle instance de modèle, mais elle n'est pas enregistrée jusqu'à ce que la méthode save soit appelée.

Créer fait la même chose que nouveau, mais l'enregistre également dans la base de données.

Parfois, vous voulez faire des choses avant de sauvegarder quelque chose dans la base de données, parfois, vous voulez juste le créer et le sauvegarder tout de suite.

15
ghoppe

Les parties RESTful de Rails sont très proches du fonctionnement du protocole HTTP. Dans le protocole HTTP, une demande GET n'est pas censée modifier des données. Logiquement, si vous examinez la façon dont toutes les actions RESTful dans Rails fonctionnent, elles seront comparées aux actions HTTP. Un POST sert à générer de nouvelles données, il est donc créé logiquement Vous utilisez un GET pour servir la version de formulaire de cette action ou, en d’autres termes, la nouvelle action. Index et show sont également des GET, update est un PUT (ou un PATCH dans Rails 4+), et détruire est un DELETE dans HTTP.

De plus, cela sépare bien la logique de l'automate et vous permet de traiter les erreurs de manière fluide (en rendant à nouveau la nouvelle action avec des messages d'erreur).

9
Jared