Rails nouveau vs créer

195

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 je dois savoir pourquoi ils sont utilisés tels qu'ils sont.

sent-hil
la source

Réponses:

263

Dans l'implémentation de REST, Rails new et create sont traités différemment.

Un HTTP GET to /resources/newest destiné à rendre un formulaire adapté à la création d'une nouvelle ressource, ce qu'il fait en appelant la nouvelle action dans le contrôleur, ce qui crée un nouvel enregistrement non enregistré et rend le formulaire.

Un HTTP POST /resourcesprend l'enregistrement créé dans le cadre de la nouvelle action et le transmet à l' action de création dans le contrôleur, qui tente ensuite de l'enregistrer dans la base de données.

Steve Weet
la source
1
J'ai parcouru exactement ces informations dans un site de tutoriel sur les rails. Ce n'est que lorsque je l'utilise que cela devient pertinent.
StorymasterQ
248

Dans la documentation ActiveRecord :: Base :

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

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

new (attributes = nil) {| self if 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 table associés). Dans les deux cas, les clés d'attribut valides sont déterminées par les noms de colonne de la table associée - vous ne pouvez donc pas avoir d'attributs qui ne font pas partie des colonnes de la table.

createInstancie donc le nouvel objet, le valide, puis l'enregistre dans la base de données. Et newcrée uniquement l'objet local mais n'essaie pas de le valider ou de l'enregistrer dans la base de données.

Justin Ethier
la source
5
Cette question concerne les méthodes du contrôleur, pas les méthodes du modèle.
sevenseacat
8
@Karpie - Merci pour le downvote. Vous soulignez un bon point, mais considérez que beaucoup de gens ont trouvé cette réponse utile, d'autant plus que ni le titre ni les balises ne l'appellent comme une question réservée au contrôleur. Je pense donc que cette réponse apporte la même valeur.
Justin Ethier
16

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

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

Parfois, vous voulez faire des choses avant d'enregistrer quelque chose dans la base de données, parfois vous voulez juste le créer et l'enregistrer immédiatement.

ghoppe
la source
1
Cette question concerne les méthodes du contrôleur, pas les méthodes du modèle.
sevenseacat
11

Les parties RESTful de Rails sont conçues pour être très proches du fonctionnement du protocole HTTP. Dans le protocole HTTP, une demande GET n'est pas censée modifier les données. Logiquement, si vous regardez le fonctionnement de toutes les actions RESTful dans Rails, elles correspondront aux actions HTTP. Un POST sert à générer de nouvelles données, il est donc logiquement créé. Vous utilisez un GET pour servir la version de formulaire de cela ou en d'autres termes, la nouvelle action. Index et show sont également des GET, la mise à jour est un PUT (ou PATCH dans Rails 4+) et destroy est un DELETE en HTTP.

De plus, il sépare bien la logique dans le contrôleur et vous donne un moyen fluide de traiter les erreurs (en restituant la nouvelle action avec des messages d'erreur).

Jared
la source
"You use a GET to serve the form version of that or in other words, the new action"merci pour la réponse mais personnellement je trouve cette convention de nommage vraiment déroutante
Daniel Lizik