ruby-on-rails - 为什么我会收到此 'can' t modify frozen hash' 错误?

标签 ruby-on-rails ruby

我有一个 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/

相关文章:

ruby-on-rails - Rails 4.2.0 中简单整数赋值的 RangeError 应该被验证捕获

ruby-on-rails - 两个表之间的连接在 Activerecord 中失败,出现未初始化的常量错误

ruby-on-rails - 如何拥有线程安全的 Rails 初始化器?

ruby - 如何制作可选的强参数键但过滤嵌套参数?

mysql - 如何在1096​​列中存储数据

ruby-on-rails - 无用户认证 (Facebook)

ruby-on-rails - Ruby on Rails : Cucumber: how do I follow a link that opens a new window?

ruby-on-rails - 将参数传递给 Rails 3 中的 before_create 回调

javascript - 在私有(private) channel 上发送 Pusher 事件

ruby - 如何知道类中包含哪些模块