Comportement incohérent dans la classe UserUpdater

@eviltrout

Étapes de reproduction :

  1. Créons un champ utilisateur dont l’identifiant est 1.
  2. Exécutez deux fois la deuxième ligne du code ci-dessous.

Cas 1

up = UserUpdater.new(Discourse.system_user, User.find(1))
up.update({:custom_fields=>{:user_field_1=>"abc"}})
  1. Vous verrez abc deux fois lorsque vous accéderez à /my/preferences/profile.

Surprenamment, lorsque le profil est mis à jour via /my/preferences/profile, cela fonctionne parfaitement.

Cas 2

Cela semble fonctionner correctement

up = UserUpdater.new(Discourse.system_user, User.find(1))
params = ActionController::Parameters.new({:custom_fields=>{:user_field_1=>"abc"}})
up.update(params.permit!)

Ce qui se passe, c’est que dans le Cas 1, la valeur est ajoutée à un tableau et affichée sous forme de valeurs séparées par des virgules sur /my/preferences/profile.

Le Cas 2 semble faire la bonne chose, c’est-à-dire qu’il remplace la valeur actuelle par la nouvelle, mais l’encapsulation dans ActionController::Parameters est peu naturelle.

4 « J'aime »

Cela semble être un bug valide et devrait être corrigé. Merci de l’avoir signalé !

4 « J'aime »

Mon analyse se résume à ceci.

# cas 1
u1 = User.find(1)
u1.custom_fields[:user_field_1] = "abc"
u1.save

# cas 2
u1.custom_fields["user_field_1"] = "abc"
u1.save

Dans le cas 1, un nouvel objet UserCustomField est créé à chaque appel à u1.save.

Dans le cas 2, tous les UserCustomField ayant pour nom ‘user_field_1’ sont supprimés de la base de données, à l’exception de celui spécifié.

Screenshot 2020-08-20 at 11.56.49 AM

En résumé, les versions symbol et string de la même clé sont traitées différemment dans le mixin HasCustomFields.

1 « J'aime »

Ok, je me suis lancé. Voici la PR qui corrige le problème

7 « J'aime »

Ok, celui-ci est donc fusionné.

3 « J'aime »