Ich habe also Leute gesehen, die .build, .create und .create verwenden! innerhalb ihrer Controller in letzter Zeit immer mehr. Was ist der Unterschied, wenn Sie nur .new verwenden und das param'd-Objekt übergeben und dann .save? Gibt es Vor- und Nachteile? Bietet die Verwendung dieser anderen Methoden Vorteile?
ruby-on-rails
Tim Knight
quelle
quelle
Obwohl es richtig ist, dass
create
Aufrufenew
und dannsave
gibt es einen großen Unterschied zwischen den beiden Alternativen in ihren Rückgabewerten.Save
Gibt entwedertrue
oderfalse
abhängig davon zurück, ob das Objekt erfolgreich in der Datenbank gespeichert wurde oder nicht. Dies kann dann zur Flusskontrolle gemäß dem ersten Beispiel in der obigen Frage verwendet werden.Create
gibt das Modell zurück, unabhängig davon, ob das Objekt gespeichert wurde oder nicht. Dies hat Auswirkungen auf den obigen Code, da der oberste Zweig derif
Anweisung immer ausgeführt wird, auch wenn das Objekt die Validierung nicht besteht und nicht gespeichert wird.Wenn Sie
create
mit Verzweigungslogik arbeiten, besteht das Risiko stiller Fehler, was bei Verwendung vonnew
+ nicht der Fall istsave
.create!
leidet nicht unter dem gleichen Problem wie es und Ausnahme, wenn der Datensatz ungültig ist.Die
create
Alternative kann in Controllern nützlich sein, in denenrespond_with
API-Antworten (JSON / XML) verwendet werden. In diesem Fall führt das Vorhandensein von Fehlern im Objekt dazu, dass die Fehler in der Antwort mit dem Status "zurückgegeben" werden. Diesunprocessable_entity
ist genau das, was Sie von einer API erwarten.Ich würde immer die Option
new
+save
für HTML verwenden, insbesondere wenn Sie sich für die Flusskontrolle auf den Rückgabewert verlassen.quelle
#create ist eine kürzere Version von new and save. #erstellen! löst eine Ausnahme aus, wenn die Validierung nicht positiv war.
quelle
Ich würde die obigen Antworten unterstützen. Außerdem
create
kann man nichtfalse
als Argument übergeben, mit dem man etwas anfangen kannsave
. Wenn Siefalse
als Argument übergeben, werden alle Schienenüberprüfungen übersprungenquelle