UserUpdater 클래스의 일관성 없는 동작

@eviltrout

재현 단계:

  1. id가 1인 사용자 필드를 생성합니다.
  2. 아래 코드 중 두 번째 줄을 두 번 실행합니다.

Case 1

up = UserUpdater.new(Discourse.system_user, User.find(1))
up.update({:custom_fields=>{:user_field_1=>"abc"}})
  1. /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로 감싸는 것은 비자연스럽습니다.

이것은 실제로 유효한 버그인 것 같으며 수정해야 합니다. 보고해 주셔서 감사합니다!

제 분석 결과는 다음과 같습니다.

# 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에서 삭제됩니다.

Screenshot 2020-08-20 at 11.56.49 AM

결국 HasCustomFields 믹스인에서는 동일한 키의 symbol 버전과 string 버전이 다르게 처리됩니다.

좋아요, 시도해 봤습니다. 문제를 수정하는 PR입니다

네, 이 건은 병합되었습니다.