이 글을 보시고 저처럼 막막하셨던 분들을 위해, 의도한 대로 동작하도록 만든 제 코드를 아래에 공유합니다. 기존 파일은 수정하지 않았습니다. 단순히 plugin.rb라는 새 파일을 생성하고 아래 내용을 넣었습니다:
# about: Allows users in Anonymous Mode to change their usernames
# version: 0.1
require_dependency 'guardian'
require_dependency 'guardian/user_guardian'
class ::Guardian
end
module ::UserGuardian
def can_edit_username?(user)
return false if SiteSetting.sso_overrides_username?
return true if is_staff?
return false if SiteSetting.username_change_period <= 0
return true if is_anonymous?
is_me?(user) && ((user.post_count + user.topic_count) == 0 || user.created_at > SiteSetting.username_change_period.days.ago)
end
def can_edit_name?(user)
return false unless SiteSetting.enable_names?
return false if SiteSetting.sso_overrides_name?
return true if is_staff?
return true if is_anonymous?
can_edit?(user)
end
end
이 코드는 Discourse 코어의 user_guardian.rb 클래스를 오버라이드하여, 사용자가 익명 계정에서 사용자 이름과 이름을 변경할 수 있도록 합니다.
여기 있는 제 코드와 Discourse 코어의 user_guardian.rb를 비교해 보면, 제가 건드릴 필요가 없었던 다른 부분들이 많이 있어 그대로 두었습니다. 제가 필요한 것은 can_edit_username과 can_edit_name 메서드 두 개에서 일부 반환 값을 false에서 true로 변경하는 것이었고, 이를 통해 제가 원하는 결과를 얻을 수 있었습니다.
물론 개선할 부분이 있을 수 있고, 여기와 다른 곳의 링크된 게시글을 읽으면서 파악할 수 있는 모범 사례가 있을 수도 있지만, 저처럼 Ruby를 처음 접하는 초보자라면 코어에서 아주 간단한 부분만 조정하고 싶을 때, 이 글은 필요한 작업을 수행하기 위한 최소한의 작동 예시를 보여줍니다.
이 스레드에서 저에게 인내심을 갖고 격려와 도움을 주신 모든 분들께 감사드립니다. 특히 이전에 다른 게시글에서 실제로 도움을 주신 @merefield님께 감사드립니다.