在插件中覆盖 user_guardian.rb(无需 fork!)

如果任何人遇到此问题,且曾像我一样感到迷茫,我将提供我的代码,因为它已按预期运行。我没有修改任何文件,只需创建一个新文件 plugin.rb,并将以下内容放入其中:

# name: noms
# about: 允许匿名模式下的用户更改其用户名
# 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 这两个方法,将某些返回值从 false 改为 true,即可实现所需功能。

当然,这仍有改进空间,也可能存在最佳实践,这些可以通过阅读此处及其他地方的相关帖子来了解。但如果你像我一样是 Ruby 新手,只想对核心功能进行一些非常简单的调整,那么这是一个极简且可工作的示例,展示了你需要做什么。

非常感谢本线程中的各位对我的耐心、鼓励与帮助!特别感谢 @merefield,他过去曾帮助过我另一个帖子。