Comportamiento inconsistente en la clase UserUpdater

@eviltrout

Pasos para reproducir:

  1. Creemos un campo de usuario con el id 1.
  2. Ejecute la segunda línea del código siguiente dos veces.

Caso 1

up = UserUpdater.new(Discourse.system_user, User.find(1))
up.update({:custom_fields=>{:user_field_1=>"abc"}})
  1. Verá abc dos veces al ir a /my/preferences/profile

Sorprendentemente, cuando el perfil se actualiza mediante /my/preferences/profile, funciona perfectamente.

Caso 2

Esto parece funcionar bien

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

Lo que ocurre es que, en el Caso 1, el valor se añade a un array y se muestra como valores separados por comas en /my/preferences/profile.

El Caso 2 parece hacer lo correcto, es decir, reemplaza el valor actual con el nuevo, pero envolverlo en ActionController::Parameters no es natural.

4 Me gusta

Eso parece ser un error válido y debería solucionarse. ¡Gracias por informarlo!

4 Me gusta

Mi análisis se reduce a lo siguiente.

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

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

En el caso 1, se crea un nuevo UserCustomField por cada llamada a u1.save.

En el caso 2, todos los UserCustomField con el nombre ‘user_field_1’ se eliminan de la base de datos, excepto el especificado.

Screenshot 2020-08-20 at 11.56.49 AM

En resumen, las versiones con símbolo y cadena de la misma clave se tratan de manera diferente en el mixin HasCustomFields.

1 me gusta

Ok, me lancé. Aquí está el PR que soluciona el problema

7 Me gusta

Ok, así que este ya está fusionado.

3 Me gusta