プラグインで user_guardian.rb をオーバーライドする(フォーク不要!)

もしこの投稿を見て、私と同じように行き詰まっていた方がいれば、実際に動作するようになった私のコードを以下に共有します。ファイルの修正は行わず、新しいファイル plugin.rb を作成し、以下の内容を記述しただけです。

# name: noms
# 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_usernamecan_edit_name の 2 つのメソッドを編集し、いくつかの戻り値を false から true に変更することだけでした。これで必要な動作を実現できました。

もちろん、さらに改善の余地はありますし、ここや他の場所でリンクされた投稿を読むことでベストプラクティスを学べたかもしれません。しかし、Ruby が全くの初心者で、コアの簡単な調整だけを実現したいという方には、必要なことがわかる最小限の動作例としてご参考ください。

このスレッドで私に根気強く向き合い、励ましやサポートをしてくれた皆さんに心から感謝しています。特に、以前も別の投稿で助けてくださった @merefield さんには大変お世話になりました。