2010-03-18 4 views
163

Pourquoi est-il nécessaire de définir une nouvelle méthode dans le contrôleur RESTful, suivi d'une méthode de création?Rails nouveau vs créer

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

Répondre

216

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

Un HTTP GET à /resources/new est destiné à rendre une forme appropriée pour la création d'une nouvelle ressource, qu'il fait en appelant la nouvelle action dans le contrôleur, ce qui crée un nouveau record non enregistré et rend la forme.

HTTP POST /resources prend l'enregistrement créé dans le cadre de la nouvelle action et il passe à la créer une action dans le contrôleur, qui tente ensuite de l'enregistrer dans la base de données.

+1

Merci pour l'explication, j'étais confus avec les deux. – Batman

+1

Plus de réponses comme ceci;) merci! – servatj

+0

J'ai parcouru exactement cette information dans un site de tutoriel sur rails. N'a pas été jusqu'à ce que je l'utilise réellement que cela devienne pertinent. – StorymasterQ

13

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

Créer fait la même chose que le nouveau, 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 créer et enregistrer tout de suite.

+1

Cette question concerne les méthodes du contrôleur, pas les méthodes du modèle. – sevenseacat

219

De la documentation ActiveRecord::Base:

créer (attributs = zéro) {| 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é si l'objet a été enregistré avec succès dans la base de données ou non.

nouveau (attributs = zéro) {| 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é (passer un hachage avec des noms clés correspondant aux noms de colonnes de 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.

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

+20

Lorsque j'ai trouvé cette page, je cherchais la réponse que vous avez fournie. Merci! – ClosureCowboy

+0

Pas de problème, heureux d'aider :) –

+4

Cette question concerne les méthodes du contrôleur, pas les méthodes du modèle. – sevenseacat

9

Les parties RESTful de Rails sont conçues pour être très proches du fonctionnement du protocole HTTP. Dans le protocole HTTP, une requête GET n'est censée modifier aucune donnée. Logiquement, si vous regardez la façon dont toutes les actions RESTful dans Rails fonctionnent, elles vont correspondre avec les actions HTTP. Un POST sert à générer de nouvelles données, il est donc créé de manière logique. Vous utilisez un GET pour servir la version du formulaire ou, en d'autres termes, la nouvelle action. L'index et le show sont aussi des GET, update est un PUT (ou PATCH dans Rails 4+), et destroy est un DELETE dans HTTP.En outre, il sépare bien la logique dans le contrôleur et vous permet de gérer les erreurs en toute simplicité (en affichant de nouveau la nouvelle action avec des messages d'erreur).