Verwenden Sie für die Massenzuweisung von Werten zu einem ActiveRecord-Modell ohne Speichern entweder die Methoden assign_attributes
oder attributes=
. Diese Methoden sind in Rails 3 und neuer verfügbar. Es sind jedoch geringfügige Unterschiede und versionierungsbedingte Fallstricke zu beachten.
Beide Methoden folgen dieser Verwendung:
@user.assign_attributes{ model: "Sierra", year: "2012", looks: "Sexy" }
@user.attributes = { model: "Sierra", year: "2012", looks: "Sexy" }
Beachten Sie, dass keine der Methoden Überprüfungen durchführt oder Rückrufe ausführt. Rückrufe und Validierungen erfolgen, wennsave
Aufruf.
Schienen 3
attributes=
unterscheidet sich geringfügig von assign_attributes
in Rails 3. attributes=
prüft, ob das an ihn übergebene Argument ein Hash ist, und gibt sofort zurück, wenn dies nicht der Fall ist; assign_attributes
hat keine solche Hash-Prüfung. Weitere Informationen finden Sie in der Dokumentation zur ActiveRecord-Attributzuweisungs-API fürattributes=
.
Der folgende ungültige Code schlägt stillschweigend fehl, indem er einfach zurückgegeben wird, ohne die Attribute festzulegen:
@user.attributes = [ { model: "Sierra" }, { year: "2012" }, { looks: "Sexy" } ]
attributes=
wird sich stillschweigend so verhalten, als ob die Zuweisungen erfolgreich durchgeführt wurden, obwohl dies wirklich nicht der Fall war.
Dieser ungültige Code assign_attributes
löst eine Ausnahme aus, wenn versucht wird, die Hash-Schlüssel des umschließenden Arrays zu stringifizieren:
@user.assign_attributes([ { model: "Sierra" }, { year: "2012" }, { looks: "Sexy" } ])
assign_attributes
löst eine NoMethodError
Ausnahme für aus stringify_keys
, die angibt, dass das erste Argument kein Hash ist. Die Ausnahme selbst ist nicht sehr informativ über die tatsächliche Ursache, aber die Tatsache, dass eine Ausnahme auftritt, ist sehr wichtig.
Der einzige Unterschied zwischen diesen Fällen besteht in der Methode für die Massenzuweisung: Sie ist im attributes=
Hintergrund erfolgreich und assign_attributes
löst eine Ausnahme aus, um zu informieren, dass ein Fehler aufgetreten ist.
Diese Beispiele scheinen erfunden zu sein, und sie sind bis zu einem gewissen Grad, aber diese Art von Fehler kann leicht auftreten, wenn Daten von einer API konvertiert werden oder wenn einfach nur eine Reihe von Datentransformationen verwendet und Hash[]
die Ergebnisse des Finales vergessen werden .map
. Behalten Sie den Code 50 Zeilen über und 3 Funktionen bei, die aus Ihrer Attributzuweisung entfernt wurden, und Sie haben ein Rezept für einen Fehler.
Die Lektion mit Rails 3 ist dies: immer verwendet assign_attributes
stattattributes=
.
Schienen 4
In Schienen 4, attributes=
ist einfach ein Alias zu assign_attributes
. Weitere Informationen finden Sie in der Dokumentation zur ActiveRecord-Attributzuweisungs-API fürattributes=
.
Bei Rails 4 kann jede Methode austauschbar verwendet werden. Wenn ein Hash nicht als erstes Argument übergeben wird, führt dies zu einer sehr hilfreichen Ausnahme:ArgumentError: When assigning attributes, you must pass a hash as an argument.
Validierungen
Wenn Sie in Vorbereitung auf a Aufgaben vor dem Flug ausführen, möchten save
Sie möglicherweise auch vor dem Speichern validiert werden. Hierfür können Sie die Methoden valid?
und invalid?
verwenden. Beide geben boolesche Werte zurück. valid?
Gibt true zurück, wenn das nicht gespeicherte Modell alle Überprüfungen besteht, oder false, wenn dies nicht der Fall ist. invalid?
ist einfach das Gegenteil vonvalid?
valid?
kann wie folgt verwendet werden:
@user.assign_attributes{ model: "Sierra", year: "2012", looks: "Sexy" }.valid?
Auf diese Weise können Sie Validierungsprobleme vor dem Anruf bearbeiten save
.