Tengo un modelo de persona & un modelo de artículo. Una persona tiene muchos elementos y un elemento pertenece a una persona.¿Por qué recibo este error 'no puedo modificar hash congelado'?
En este código, necesito eliminar los elementos existentes para una persona y crear nuevos desde un parámetro (que es una matriz de valores hash). Entonces, necesito actualizar uno de los campos del artículo, basado en uno de sus otros campos.
@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
En los x.item_amount = "5"
& x.item_amount = "10"
líneas consigo este error:
RuntimeError in PersonsController#submit_items
can't modify frozen hash
¿Cómo puedo solucionar este problema? Gracias por leer.
Gracias por su respuesta. Aunque no estoy seguro de entender, no estoy tratando de modificar el objeto hash/JSON, estoy tratando de modificar el objeto ActiveRecord que acabo de crear. Esto puede haber sido un poco confuso en mi código, he cambiado algunos de los nombres de las variables para tratar de hacerlo más claro. – ben
Creo que ActiveSupport :: JSON.decode (params ["person_items"]) crea el hash congelado.pero cuando lo vuelva a cargar, ActiveRecord solo instanciará un nuevo hash que no está congelado – EnabrenTane
la recarga funciona cuando se intentó eliminar el elemento principal después de eliminar el elemento secundario – Anwar