Mam model osoby & model przedmiotu. Osoba ma wiele przedmiotów, a przedmiot należy do osoby.Dlaczego otrzymuję komunikat o błędzie "Nie można zmienić zamrożonego hasha"?
W tym kodzie, muszę usunąć istniejące elementy dla osoby i utworzyć nowe z parametru (który jest tablicą skrótów). Następnie muszę zaktualizować jedno z pól elementu na podstawie jednego z jego pozostałych pól.
@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
Na x.item_amount = "5"
& x.item_amount = "10"
liniach dostaję ten błąd:
RuntimeError in PersonsController#submit_items
can't modify frozen hash
Jak mogę rozwiązać ten problem? Dziękuje za przeczytanie.
Dzięki za odpowiedź. Nie jestem pewien, czy rozumiem, nie próbuję modyfikować obiektu hash/JSON, próbuję zmodyfikować obiekt ActiveRecord, który właśnie utworzyłem. To mogło być nieco mylące w moim kodzie, zmieniłem niektóre z nazw zmiennych, aby spróbować je wyjaśnić. – ben
Wierzę, że ActiveSupport :: JSON.decode (parametry ["person_items"]) tworzy zamrożony skrót.ale po ponownym załadowaniu ActiveRecord po prostu tworzy nowy hasz, który nie jest zamrożony. – EnabrenTane
przeładowanie działa po próbie usunięcia nadrzędnego po usunięciu potomka – Anwar