我有一个人模型和一个项目模型。一个人有很多物品,而一个物品属于一个人。

在这段代码中,我需要删除一个人的现有项,并从一个参数(这是一个哈希数组)中创建新项。然后,我需要根据项目的其他字段之一来更新项目的字段之一。

@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'修改“卡住哈希”错误?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4481790/

10-12 19:23