私はPersonモデル&を持っています。人には多くのアイテムがあり、アイテムは人に属します。「フリーズハッシュを修正できません」というエラーが表示されるのはなぜですか?
このコードでは、人物の既存のアイテムを削除し、パラメータ(ハッシュの配列)から新しいアイテムを作成する必要があります。次に、アイテムのフィールドの1つを他のフィールドの1つに基づいて更新する必要があります。 x.item_amount = "5"
& x.item_amount = "10"
ラインで
@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
私はこのエラーを取得する:
RuntimeError in PersonsController#submit_items
can't modify frozen hash
私はこれをどのように修正することができますか?読んでくれてありがとう。
感謝。私はハッシュ/ JSONオブジェクトを変更しようとしていませんが、私が作成したばかりのActiveRecordオブジェクトを変更しようとしています。これは私のコードでは少し混乱しているかもしれませんが、私はいくつかの変数名を変更してより明確にしようとしました。 – ben
私は、ActiveSupport :: JSON.decode(params ["person_items"])がフリーズされたハッシュを作成すると信じています。あなたがそれをリロードすると、ActiveRecordはフリーズされていない新しいハッシュをインスタンス化します – EnabrenTane
リロードは、子を削除した後に親を削除しようとすると動作します – Anwar