Das verschachtelte Attribut update_attributes verwendet insert statt update
Ich habe eine Benutzer-und nested-Profil-Klasse wie folgt:
class User < ActiveRecord::Base
has_one :profile
attr_accessible :profile_attributes
accepts_nested_attributes_for :profile
end
class Profile < ActiveRecord::Base
belongs_to :user
attr_accessible :name
end
user = User.find(1)
user.profile.id # => 1
user.update_attributes(profile_attributes: {name: 'some name'})
user.profile.id # => 2
Ich verstehe nicht, warum rails ist das wegwerfen der alten Profil und eine neue erstellen.
Mit
user.profile.update_attributes({name: 'some name'})
nur updates, das aktuelle Profil, wie erwartet.
Aber in diesem Fall bin ich nicht nutzen accepts_nested_attributes_for
Weiß jemand, warum das update auf diese Weise geschieht? Ich würde lieber nicht bis zum Ende mit einer Datenbank von Profil-Zeilen, die nicht mit einem Benutzer.
Kommentar zu dem Problem - Öffnen
vielleicht können Sie versuchen,
user.update_attributes(profile_attributes: {:id =>Benutzer.Profil.id, :name,: 'einige name'})
InformationsquelleAutor der Frage Jason | 2012-03-30
Du musst angemeldet sein, um einen Kommentar abzugeben.
Für alle, die das gleiche problem in Rails 4: fields_for schon fügt die id für Ihren geschachtelte Formen, aber Sie haben, um zu ermöglichen :id-parameter. Ich habe nur zulässig :object_name_id parameter und, da diese nicht werfen Fehler es hat einige Zeit gedauert, bis ich dies sah in den server-logs. Hoffentlich hilft jemanden verschwenden weniger Zeit als ich 🙂
InformationsquelleAutor der Antwort irruputuncu
Wenn Sie überprüfen Sie Ihre form, müssen Sie das id-Attribut innerhalb des geschachtelten Attribut-hash für Ihre Profil-Objekt. Wenn die id nicht gesetzt wird, ActiveRecord nimmt an, dass es ein neues Objekt.
Zum Beispiel, wenn Sie hatte ein ERB form der Aufbau einer Reihe von 'user' - Parameter mit einer verschachtelten 'profile_attributes' parameter-hash für die nested-Profil für den Benutzer, Sie könnte einen versteckten Wert für die Profil-id, wie diese:
InformationsquelleAutor der Antwort Winfield
Löste ich dieses problem durch hinzufügen der
update_only
option:Nun ein neues Profil wird nur dann angelegt, wenn nicht bereits vorhanden.
InformationsquelleAutor der Antwort Jason
War ich hit mit dieser in einer anderen version von Rails und ich dachte, ich werde meinen Verstand verlieren.
Beim hinzufügen update_only => true es gelöst ich denke es ist ein bug irgendwo in den Schienen.
Symptome in meinem Fall: ich würde die Zuordnung zu der belongs_to gelöscht und neue verschachtelte Objekt erstellt - bis ich das erste aktualisiert die Seite. Danach funktionierte es richtig.
In meinem Fall habe ich ein before_save Methode, um meine geschachtelte Klasse und gedruckt, was es gespeichert.
Ich habe auch die gedruckten Attribute vor dem Aufruf update_attributes. Sie hatten die "parent_id" richtig eingestellt.
Ich habe auch die versteckten id-Feld in der form, nicht ändern - was normal war, wie es war, bereits enthalten durch die Verwendung fields_for...
Überraschung: ich sah einen update-Aufruf erzeugen zwei save-aufrufen.
Zuerst speichern Sie hätte das verschachtelte Objekt-id, aber null für die belongs_to-id. - so würde dies eine Aktualisierung des Datensatzes festlegen "parent_id" zu null.
Die zweite sichern würde, haben die "parent_id" gesetzt, aber es hätte das verschachtelte Objekt-id auf null gesetzt.
Als ich sagte, dass ich es behoben durch hinzufügen update_only => true, aber ich denke, es ist noch ein bug.
Ich würde gerne herausfinden, ob die oben genannten Symptome gelten für den Fall zu, dies zu bestätigen, ist ein bug.
InformationsquelleAutor der Antwort Victors