it-swarm.com.de

Die Unterschiede zwischen .build, .create und .create! und wann sollten sie verwendet werden?

Also habe ich Leute gesehen, die .build, .create und .create benutzen! in letzter Zeit immer mehr innerhalb ihrer Controller. Was ist der Unterschied zwischen der Verwendung von .new und der Übergabe des param'd-Objekts und der anschließenden Speicherung? Gibt es Vor- und Nachteile? Bietet die Verwendung dieser anderen Methoden Vorteile?

164
Tim Knight

Es gibt ein paar Unterschiede, aber sie sind nicht groß:

  1. .create ist äquivalent zu .new gefolgt von .save. Es ist nur prägnanter.
  2. .create! ist äquivalent zu .new gefolgt von .save! (wirft einen Fehler aus, wenn das Speichern fehlschlägt). Es ist auch nur ein bisschen kürzer
  3. Ich glaube .build ist meistens ein Alias ​​für .new. Es funktioniert auf eine Weise in Rails und auf eine andere Weise in Rails <3.x)

Der wichtigste Teil ist jedoch, dass diese Methoden über eine Assoziation aufgerufen werden können (has_many usw.), um die beiden Modelle automatisch zu verbinden.

227
zenazn

Obwohl es richtig ist, dass createnew und dann save aufruft, gibt es einen großen Unterschied zwischen den beiden Alternativen in ihren Rückgabewerten.

Save gibt entweder true oder false zurück, je nachdem, ob das Objekt erfolgreich in der Datenbank gespeichert wurde oder nicht. Dies kann dann zur Flusssteuerung 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 obere Zweig der if -Anweisung immer ausgeführt wird, selbst wenn die Validierung des Objekts fehlschlägt und nicht gespeichert wird.

Wenn Sie create mit Verzweigungslogik verwenden, besteht das Risiko stiller Fehler, was bei Verwendung von new + save nicht der Fall ist.

create! Leidet nicht unter demselben Problem wie es ausgelöst wird und Ausnahme, wenn der Datensatz ungültig ist.

Die Alternative create kann in Controllern nützlich sein, in denen respond_with Für API-Antworten (JSON/XML) verwendet wird. In diesem Fall führt das Vorhandensein von Fehlern im Objekt dazu, dass die Fehler in der Antwort mit dem Status unprocessable_entity Zurückgegeben werden. Dies 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 Flusssteuerung auf den Rückgabewert verlassen.

32
nmott

#create ist eine kürzere Version von new and save. #erstellen! Löst eine Ausnahme aus, wenn die Validierung nicht positiv war.

6
rkj

Ich würde die obigen Antworten unterstützen. Außerdem kann man für create nicht false als Argument übergeben, was Sie mit save tun können. Wenn Sie false als Argument übergeben, werden alle Rails Validierungen übersprungen

5
Vineeth