由于错误,无法授予管理员权限

您好!

在尝试授予用户(实际上是任何用户)管理员权限时,我只收到以下错误消息(在点击确认链接后):

我检查了日志,发现了以下消息:

ActiveRecord::RecordInvalid (Validation failed: Name has already been taken) app/models/group.rb:607:in 'refresh_automatic_group!' app/models/group.rb:666:in 'block in refresh_automatic_groups!' app/m

Failed to handle exception in exception app middleware : ActiveRecord::RecordInvalid : Validation failed: Name has already been taken

大约在同一时间,我还收到一条关于 MaxMind 无法正常工作的消息,不确定这是否与此有关(在管理员界面中未找到任何相关设置):

MaxMindDB (/var/www/discourse/vendor/data/GeoLite2-City.mmdb) could not be found: No such file or directory @ rb_sysopen - /var/www/discourse/vendor/data/GeoLite2-City.mmdb

如何进一步调试这个问题?

谢谢,
Hannes

您在点击“授予管理员权限”按钮时遇到该错误?

不,点击“授予管理员”按钮可以正常工作。

完整流程如下:

  1. 我点击“授予管理员”按钮,应用程序会弹出一个模态框:“我们已向您发送一封电子邮件以验证新管理员。请打开它并按照说明操作。”
  2. 我点击电子邮件中的确认链接(“确认管理员帐户”),该链接将我带到一个确认页面。
  3. 在确认页面上,我点击“授予管理员访问权限”按钮,然后出现错误页面(请参阅我原始帖子中的屏幕截图),日志中也显示了错误消息。

我还注意到日志中更靠上的以下消息(前面带有数字 46 - 这是否意味着它已重复 46 次):

Error ensuring consistency for Group: Validation failed: Name has already been taken

这似乎是一个非常有趣的边缘情况。假设这是自托管的,它会返回什么?

./launcher enter app
rails c
Group.pluck(:name, :id)
=> [["everyone", 0],
 ["moderators", 2],
 ["admins", 1],
 ["staff", 3],
 ["trust_level_0", 10],
 ["trust_level_1", 11],
 ["trust_level_2", 12],
 ["trust_level_3", 13],
 ["trust_level_4", 14]]

Discourse 对这些 ID 非常讲究,staff 必须是 2,admins 必须是 1。如果你碰巧有同名的其他组,可能会出问题。我也会确保没有用户名为 admins

看起来是这样的(还有很多其他组,但它们显然是我们创建的,并且与系统组没有任何相似之处,所以我没有在下面包含它们):

=> [["everyone", 0],
 ["moderators", 2],
 ["admins", 1],
 ["trust_level_0", 10]
 ["trust_level_1", 11],
 ["trust_level_2", 12],
 ["trust_level_3", 13],
 ["trust_level_4", 14],
 ["Staff", 42]]

我注意到没有名为 staff 的组,只有一个名为 Staff 的组 - 如果 staff 始终具有 id 3,那么我认为这表明有人删除了它并创建了一个新组(id 42)。

重新创建 staff 是否足够,或者我该如何解决这个问题?

是的,我认为重新命名你的员工组就足以解决这个问题

1 个赞

UI 不允许我这样做:

我需要直接在数据库中进行吗?

是否可以通过命令行重命名组,或者我该如何解决这种情况?

那就直接从数据库尝试吧,应该是安全的

2 个赞

是的,这招奏效了!该组确实存在,但有人将其重命名了——由于这基本上破坏了核心功能,我想知道是否应该在 UI 中禁止重命名系统组。

供记录,以防有人遇到类似情况:

docker exec -it app /bin/bash
su - postgres
psql -d discourse
discourse=# update groups set name='staff' where id=3;
\q
5 个赞

是的,这绝对应该是一个你无法进入的状态。

3 个赞