fzngagan
(Faizaan Gagan)
1
@eviltrout
Passos para reproduzir:
- Vamos criar um campo de usuário com o ID
1.
- 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"}})
- 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
eviltrout
(Robin Ward)
3
Isso parece ser um bug válido e deve ser corrigido. Obrigado por relatá-lo!
4 curtidas
fzngagan
(Faizaan Gagan)
5
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.

No geral, as versões symbol e string da mesma chave são tratadas de forma diferente no mixin HasCustomFields.
1 curtida
fzngagan
(Faizaan Gagan)
6
Ok, eu parti para isso. Aqui está o PR que corrige o problema
7 curtidas
fzngagan
(Faizaan Gagan)
7
Ok, então este aqui foi mesclado.
3 curtidas