通过 CLI 对多个用户配置文件/首选项进行批量配置更改

大家好,

我有一个多语言论坛,因此启用了“允许用户区域设置”和“从 Accept-Language 请求头设置区域设置”,效果非常好。我注册了一个测试用户,注意到新用户的个人资料中会自动保存其浏览器的语言设置(而不是显示为“(默认)”),这非常完美。

我遇到的唯一问题是,我从 phpBB 迁移了 800 名用户,他们的个人资料中都显示为“(默认)”。我知道其中很大一部分用户希望使用其他语言,但我不想更改全局配置中的默认英语,因为我希望英语保持为默认语言。

请问是否有可能进入 Discourse(通过 ./launcher enter app),然后遍历用户名/ID 列表(或任何标识),并修改指定用户个人资料的区域设置?

我原本打算创建一个简单的 Bash 脚本,如下所示:

while IFS= read -r username; do
  rails r "u = User.... $username"
done < list_of_usernames.txt

但我缺乏 Discourse 的相关知识,不知道如何运行命令来编辑用户偏好设置……能否请您帮我解决这个问题?

谢谢。

Rudy

是的,这可以通过 Rails 控制台完成。要进入 Rails 控制台,请运行 ./launcher enter app,然后在提示符下输入 rails c 以启动 Rails 控制台。

在确定具体会发生什么之前,请谨慎地遍历所有用户。以下是我在自己的网站上为单个用户测试的方法:

首先,获取 Discourse 使用的语言环境列表:

I18n.available_locales

这将输出一长串 Discourse 用于语言环境的符号。例如 :be, :bg, :bs_BA, :ca...

您可以使用这些符号来设置语言环境。例如,将用户的语言环境更新为法语:

u = User.find(1)
u.update(locale: :fr)

如果您想遍历用户,需要找出如何获取每个语言环境对应的用户数组,以便进行遍历。如果您有每个语言环境对应的用户名列表,可以用它来查找用户。从控制台操作的简单方法是将用户名列表转换为数组。例如:

fr_users = ['bob', 'sally', 'john']

fr_users.each do |username|
    u = User.find_by(username: username)
    u.update(locale: :fr)
end

如果您尝试此操作,请务必小心。在进行更改之前,请确保先备份网站的数据库。

非常感谢 @simon,这段代码帮了我大忙。

我对 Ruby 完全没有任何经验,但我熟悉其他编程语言,所以没过多久就写出了以下代码:

all_users = User.find_each()

all_users.each do |user|
    if user.id > 70 and user.active == true and user.admin == false and user.trust_level == 1 and user.suspended_at == nil and user.moderator == false
        puts "MODIFY: #{user.id}: #{user.trust_level}: \"#{user.username}\""
        user.update(locale: :fr)
    else
        # 跳过此用户
        puts "------: #{user.id}: #{user.trust_level}: \"#{user.username}\""
    end
end

我对 Ruby 一无所知,所以肯定有更巧妙的方法来实现。不过这个方法对我很管用 ;-)。谢谢。