Comportamento inconsistente na classe UserUpdater

@eviltrout

Passos para reproduzir:

  1. Vamos criar um campo de usuário com o ID 1.
  2. Execute a segunda linha do código abaixo duas vezes.

Caso 1

up = UserUpdater.new(Discourse.system_user, User.find(1))
up.update({:custom_fields=>{:user_field_1=>"abc"}})
  1. Você verá abc duas vezes ao acessar /my/preferences/profile

Surpreendentemente, quando o perfil é atualizado via /my/preferences/profile, tudo funciona perfeitamente.

Caso 2

Isso parece funcionar corretamente

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

O que acontece é que, no Caso 1, o valor é adicionado a um array e exibido como valores separados por vírgula em /my/preferences/profile.

O Caso 2 parece fazer o correto, ou seja, substitui o valor atual pelo novo, mas envolver isso em ActionController::Parameters é pouco natural.

4 curtidas

Isso parece ser um bug válido e deve ser corrigido. Obrigado por relatá-lo!

4 curtidas

Minha análise se resume a isso.

# 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

No caso 1, um novo UserCustomField é criado a cada chamada a u1.save.

No caso 2, todos os UserCustomField com o nome ‘user_field_1’ são excluídos do banco de dados, exceto o especificado.

Screenshot 2020-08-20 at 11.56.49 AM

No geral, as versões symbol e string da mesma chave são tratadas de forma diferente no mixin HasCustomFields.

1 curtida

Ok, eu parti para isso. Aqui está o PR que corrige o problema

7 curtidas

Ok, então este aqui foi mesclado.

3 curtidas