Ich habe eine Person Modell & ein Item-Modell. Eine Person hat viele Gegenstände und ein Gegenstand gehört einer Person.Warum bekomme ich den Fehler 'kann eingefrorenes Hash nicht ändern'?
In diesem Code muss ich die vorhandenen Elemente für eine Person löschen, und neue von einem Parameter (der ein Array von Hashes ist) erstellen. Dann muss ich eines der Felder des Elements basierend auf einem seiner anderen Felder aktualisieren.
@person = Person.find(params["id"])
@person.person_items.each do |q|
q.destroy
end
person_items_from_param = ActiveSupport::JSON.decode(params["person_items"])
person_items_from_param.each do |pi|
@person.person_items.create(pi) if pi.is_a?(Hash)
end
@person.person_items.each do |x|
if x.item_type == "Type1"
x.item_amount = "5"
elsif x.item_type == "Type2"
x.item_amount = "10"
end
x.save
end
Auf den x.item_amount = "5"
& x.item_amount = "10"
Linien bekomme ich diesen Fehler:
RuntimeError in PersonsController#submit_items
can't modify frozen hash
Wie kann ich dieses Problem beheben? Danke fürs Lesen.
Vielen Dank für Ihre Antwort. Ich bin mir nicht sicher, ob ich das verstehe, ich versuche nicht, das Hash/JSON-Objekt zu ändern, ich versuche das ActiveRecord-Objekt zu ändern, das ich gerade erstellt habe. Das mag in meinem Code etwas verwirrend gewesen sein. Ich habe einige der Variablennamen geändert, um sie klarer zu machen. – ben
Ich glaube ActiveSupport :: JSON.decode (params ["person_items"]) erstellt den eingefrorenen Hash.aber wenn Sie es neu laden wird ActiveRecord nur einen neuen Hash instanziieren, der nicht eingefroren ist – EnabrenTane
reload funktioniert, wenn versucht wird, Eltern nach dem Löschen Kind löschen – Anwar