fzngagan
(Faizaan Gagan)
1
@eviltrout
재현 단계:
- id가
1인 사용자 필드를 생성합니다.
- 아래 코드 중 두 번째 줄을 두 번 실행합니다.
Case 1
up = UserUpdater.new(Discourse.system_user, User.find(1))
up.update({:custom_fields=>{:user_field_1=>"abc"}})
/my/preferences/profile로 이동하면 abc가 두 번 표시되는 것을 확인할 수 있습니다.
놀랍게도, 프로필이 /my/preferences/profile을 통해 업데이트될 때는 정상적으로 동작합니다.
Case 2
이 경우 정상적으로 동작하는 것으로 보입니다.
up = UserUpdater.new(Discourse.system_user, User.find(1))
params = ActionController::Parameters.new({:custom_fields=>{:user_field_1=>"abc"}})
up.update(params.permit!)
Case 1에서는 값이 배열에 push되어 /my/preferences/profile에서 쉼표로 구분된 값으로 표시됩니다.
Case 2는 현재 값을 새 값으로 대체하는 방식으로 올바르게 동작하지만, ActionController::Parameters로 감싸는 것은 비자연스럽습니다.
이것은 실제로 유효한 버그인 것 같으며 수정해야 합니다. 보고해 주셔서 감사합니다!
fzngagan
(Faizaan Gagan)
5
제 분석 결과는 다음과 같습니다.
# 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
case 1에서는 u1.save가 호출될 때마다 새로운 UserCustomField가 생성됩니다.
case 2에서는 이름이 'user_field_1’인 모든 UserCustomField가 지정된 것을 제외하고 db에서 삭제됩니다.

결국 HasCustomFields 믹스인에서는 동일한 키의 symbol 버전과 string 버전이 다르게 처리됩니다.
fzngagan
(Faizaan Gagan)
6
좋아요, 시도해 봤습니다. 문제를 수정하는 PR입니다