11
votes

Pourquoi est-ce que je reçois cela "ne peut pas modifier" l'erreur de hachage gelée?

J'ai un modèle de personne et un modèle d'article. Une personne a de nombreux articles et un article appartient à une personne.

Dans ce code, j'ai besoin de supprimer les éléments existants pour une personne et de créer de nouveaux à partir d'un paramètre (qui est un tableau de haubans). Ensuite, j'ai besoin de mettre à jour l'un des champs de l'article, en fonction de l'un de ses autres champs. xxx

sur le x.item_amount = "5" & x.item_amount = "10" Lignes I Obtenir cette erreur: xxx

Comment puis-je résoudre ce problème? Merci de la lecture.


0 commentaires

4 Réponses :


7
votes

Je soupçonnerais xxx

renvoie un hachage congelé que vous utilisez ensuite pour créer des objets xxx

et depuis sa congelée que vous pouvez " t Modifiez-le.

vous pouvez

a Faites une copie profonde de l'objet JSON

ou

b Rechargez l'instance de modèle qui doit rétabiliser l'objet de rendant les champs de manière inégale.

option A est la solution «meilleure», mais difficile, car la seule façon dont je connais de la copie profonde est la sérialisation et la désérialisation et l'affectation de la place et de l'attribution la valeur de retour.


3 commentaires

Merci pour votre réponse. Je ne suis pas sûr que je comprenne cependant, je n'essaie pas de modifier l'objet Hash / JSON, j'essaie de modifier l'objet ActiveRecord que je viens de créer. Cela peut avoir été un peu déroutant dans mon code, j'ai modifié certains des noms de variable pour essayer de le rendre plus clair.


Je crois que ActiveSupport :: json.decode (paramètres ["person_items"] crée le hachage gelé. Mais lorsque vous rechargez IT, ActiveCord, il suffira d'instancier un nouveau hachage qui n'est pas gelé


Recharger fonctionne lorsque vous avez essayé de supprimer le parent après avoir supprimé l'enfant



2
votes

Vous pouvez contourner cela si vous lisez la personne_Items de la base de données à nouveau plutôt que d'utiliser l'association. L'association est rassis et pointant vers les rangées détruites.

au lieu de @ PERSON.PERSON_ITEMS.ATEMCH.ECH DO | X |

essayer PersonImitem.Où (: PERSON_ID => @ PERSERNE.ID). Cherchez-vous | x |


0 commentaires

6
votes

Si vous utilisez Q.Destroy avant d'enregistrer l'élément, vous obtiendrez l'erreur. mieux sauvegarder l'élément d'abord, puis utiliser Détruire.


0 commentaires

0
votes

Vous pouvez faire une copie profonde de tout objet dans les rails incluant JSON, alors faites-le simplement. N'oubliez pas que clone code> conserve l'état congelé, tandis que DUP code> ne signifie pas.

La meilleure façon de corriger l'erreur ne peut pas modifier la matrice congelée code> est à DUP CODE> Ce tableau congelé;) P>

person_items_from_param = ActiveSupport::JSON.decode(params["person_items"]).dup


0 commentaires