Schienen neu vs erstellen

195

Warum muss im RESTful-Controller eine neue Methode definiert und anschließend eine Erstellungsmethode erstellt werden?

Die Google-Suche hat mir nicht die Antwort gegeben, nach der ich gesucht habe. Ich verstehe den Unterschied, muss aber wissen, warum sie so verwendet werden, wie sie sind.

sent-hil
quelle

Antworten:

263

Innerhalb der Rails-Implementierung von REST werden new und create unterschiedlich behandelt.

Ein HTTP GET to /resources/newsoll ein Formular rendern, das zum Erstellen einer neuen Ressource geeignet ist. Dies geschieht durch Aufrufen der neuen Aktion innerhalb des Controllers, wodurch ein neuer nicht gespeicherter Datensatz erstellt und das Formular gerendert wird.

Ein HTTP-POST /resourcesnimmt den als Teil der neuen Aktion erstellten Datensatz und übergibt ihn an die Erstellungsaktion innerhalb des Controllers, die dann versucht, ihn in der Datenbank zu speichern.

Steve Weet
quelle
1
Ich habe genau diese Informationen in einer Rails-Tutorial-Site überflogen. Erst wenn ich es tatsächlich benutze, wird es relevant.
StorymasterQ
248

Aus der ActiveRecord :: Base- Dokumentation:

create (Attribute = Null) {| Objekt | ...}

Erstellt ein Objekt (oder mehrere Objekte) und speichert es in der Datenbank, wenn die Validierungen erfolgreich sind. Das resultierende Objekt wird zurückgegeben, unabhängig davon, ob das Objekt erfolgreich in der Datenbank gespeichert wurde oder nicht.

neu (Attribute = nil) {| self wenn block_given? | ...}

Neue Objekte können entweder als leer (übergeben Sie keinen Konstruktionsparameter) oder als voreingestellt mit Attributen instanziiert, aber noch nicht gespeichert (übergeben Sie einen Hash mit Schlüsselnamen, die mit den zugehörigen Tabellenspaltennamen übereinstimmen). In beiden Fällen werden gültige Attributschlüssel durch die Spaltennamen der zugeordneten Tabelle bestimmt. Daher können Sie keine Attribute haben, die nicht Teil der Tabellenspalten sind.

So createinstanziiert das neue Objekt, überprüft sie und speichert sie dann in die Datenbank. Erstellt newnur das lokale Objekt, versucht jedoch nicht, es zu validieren oder in der Datenbank zu speichern.

Justin Ethier
quelle
5
Diese Frage bezieht sich auf die Controller-Methoden, nicht auf die Modellmethoden.
Sevenseacat
8
@ Karpie - Danke für die Ablehnung. Sie machen einen guten Punkt, aber denken Sie, dass viele Leute diese Antwort nützlich fanden, zumal weder der Titel noch die Tags sie als reine Controller-Frage bezeichnen. Ich denke, diese Antwort liefert trotzdem einen Wert.
Justin Ethier
16

New instanziiert eine neue Model-Instanz, wird jedoch erst gespeichert, wenn die Speichermethode aufgerufen wird.

Create macht das Gleiche wie new, speichert es aber auch in der Datenbank.

Manchmal möchten Sie Dinge tun, bevor Sie etwas in der Datenbank speichern, manchmal möchten Sie es einfach erstellen und sofort speichern.

Ghoppe
quelle
1
Diese Frage bezieht sich auf die Controller-Methoden, nicht auf die Modellmethoden.
Sevenseacat
11

Die RESTful-Teile von Rails sind so ähnlich wie das HTTP-Protokoll. Im HTTP-Protokoll darf eine GET-Anforderung keine Daten ändern. Wenn Sie sich die Funktionsweise aller RESTful-Aktionen in Rails ansehen, stimmen sie logischerweise mit HTTP-Aktionen überein. Ein POST dient zum Generieren neuer Daten und wird daher logisch erstellt. Sie verwenden ein GET, um die Formularversion dieser oder mit anderen Worten die neue Aktion bereitzustellen. Index und Show sind ebenfalls GETs, Update ist ein PUT (oder PATCH in Rails 4+) und Destroy ist ein DELETE in HTTP.

Darüber hinaus wird die Logik in der Steuerung gut voneinander getrennt und Sie können problemlos mit Fehlern umgehen (indem Sie die neue Aktion mit Fehlermeldungen erneut rendern).

Jared
quelle
"You use a GET to serve the form version of that or in other words, the new action"
Vielen