我有一个 Person 模型和一个 Item 模型。一个人有很多元素,一个元素属于一个人。
在此代码中,我需要删除一个人的现有项目,并根据参数(这是一个哈希数组)创建新项目。然后,我需要根据项目的其他字段之一更新项目的字段之一。
@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
在 x.item_amount = "5"
& x.item_amount = "10"
行我得到这个错误:
RuntimeError in PersonsController#submit_items
can't modify frozen hash
我该如何解决这个问题?感谢阅读。
最佳答案
我怀疑
ActiveSupport::JSON.decode(params["person_items"])
返回一个卡住的散列,然后你可以用它来创建对象
@person.person_items.create(pi) if pi.is_a?(Hash)
而且由于它已卡住,您无法对其进行修改。
你可以
一个 制作 JSON 对象的深拷贝
或
乙 重新加载模型实例,该实例应重新实例化使字段解冻的对象。
选项 A 是“更好”的解决方案,但也很困难,因为我所知道的深度复制的唯一方法是序列化和反序列化以及就地对象和分配返回值。
关于ruby-on-rails - 为什么我会收到此 'can' t modify frozen hash' 错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4481790/