플러그인에서 user_guardian.rb 오버라이드 (포크 불필요!)

이 글을 보시고 저처럼 막막하셨던 분들을 위해, 의도한 대로 동작하도록 만든 제 코드를 아래에 공유합니다. 기존 파일은 수정하지 않았습니다. 단순히 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님께 감사드립니다.