fzngagan
(Faizaan Gagan)
1
@eviltrout
Repro steps:
- Let’s create a user field and it has id
1.
- Run the second line of the below code twice.
Case 1
up = UserUpdater.new(Discourse.system_user, User.find(1))
up.update({:custom_fields=>{:user_field_1=>"abc"}})
- You’ll see
abc twice when you go to /my/preferences/profile
Surprisingly, when the profile is updated via /my/preferences/profile, it does so perfectly fine.
Case 2
This seems to work fine
up = UserUpdater.new(Discourse.system_user, User.find(1))
params = ActionController::Parameters.new({:custom_fields=>{:user_field_1=>"abc"}})
up.update(params.permit!)
What happens is, in Case 1, the value is pushed to an array and is displayed as comma-separated values on /my/preferences/profile.
Case 2 seems to do the correct thing i.e. it replaces the current value with the new one but wrapping it in ActionController::Parameters is unnatural.
4 إعجابات
eviltrout
(Robin Ward)
3
This does seem like a valid bug and should be fixed, thanks for reporting it!
4 إعجابات
fzngagan
(Faizaan Gagan)
5
My analysis comes down to this.
# case 1
u1 = User.find(1)
u1.custom_fields[:user_field_1] = "abc"
u1.save
# case 2
u1.custom_fields["user_field_1"] = "abc"
u1.save
In case 1, A new UserCustomField is created per call to u1.save
In case 2, All UserCustomField with the name ‘user_field_1’ are deleted from the db
except the specified.
All and all the symbol and string versions of the same key are treated differently in the HasCustomFields mixin.
إعجاب واحد (1)
fzngagan
(Faizaan Gagan)
6
Ok, I went for it. Here’s the PR which fixes the issue
7 إعجابات
fzngagan
(Faizaan Gagan)
7
Ok, so this one is merged.
3 إعجابات