如果任何人遇到此问题,且曾像我一样感到迷茫,我将提供我的代码,因为它已按预期运行。我没有修改任何文件,只需创建一个新文件 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_username 和 can_edit_name 这两个方法,将某些返回值从 false 改为 true,即可实现所需功能。
当然,这仍有改进空间,也可能存在最佳实践,这些可以通过阅读此处及其他地方的相关帖子来了解。但如果你像我一样是 Ruby 新手,只想对核心功能进行一些非常简单的调整,那么这是一个极简且可工作的示例,展示了你需要做什么。
非常感谢本线程中的各位对我的耐心、鼓励与帮助!特别感谢 @merefield,他过去曾帮助过我另一个帖子。