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

**URL:** https://meta.discourse.org/t/bulk-change-of-configuration-via-cli-in-multiple-user-profiles-preferences/162947
**Category:** Support
**Created:** [2020 年9 月 3 日 17:52 UTC](https://meta.discourse.org/t/bulk-change-of-configuration-via-cli-in-multiple-user-profiles-preferences/162947 "2020-09-03T17:52:58Z")
**Posts on this page:** 4
**Page:** 1

<div class="post-metadata">

### Author: ![rudy](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/rudy/32/192627_2.png) [@rudy](https://meta.discourse.org/u/rudy)
#### Post date: [2020 年9 月 3 日 17:52 UTC](https://meta.discourse.org/t/bulk-change-of-configuration-via-cli-in-multiple-user-profiles-preferences/162947/1 "2020-09-03T17:52:58Z")

</div>

大家好，

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

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

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

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

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

```

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

谢谢。

Rudy

---

<div class="post-metadata">

### Author: ![simon](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/simon/32/339122_2.png) [@simon](https://meta.discourse.org/u/simon)
#### Post date: [2020 年9 月 4 日 00:19 UTC](https://meta.discourse.org/t/bulk-change-of-configuration-via-cli-in-multiple-user-profiles-preferences/162947/2 "2020-09-04T00:19:32Z")

</div>

> [@rudy](#):
>
> 请问是否可以通过进入 Discourse（`./launcher enter app`），遍历用户名/ID 列表（或其他内容），并更改指定用户配置文件的语言？

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

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

首先，获取 Discourse 使用的语言环境列表：

```plaintext
I18n.available_locales

```

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

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

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

```

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

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

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

```

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

---

<div class="post-metadata">

### Author: ![rudy](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/rudy/32/192627_2.png) [@rudy](https://meta.discourse.org/u/rudy)
#### Post date: [2020 年9 月 4 日 09:23 UTC](https://meta.discourse.org/t/bulk-change-of-configuration-via-cli-in-multiple-user-profiles-preferences/162947/3 "2020-09-04T09:23:04Z")

</div>

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

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

```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 一无所知，所以肯定有更巧妙的方法来实现。不过这个方法对我很管用 ;-)。谢谢。

---

<div class="post-metadata">

### Author: ![system](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/system/32/443519_2.png) [@system](https://meta.discourse.org/u/system)
#### Post date: [2020 年10 月 4 日 09:24 UTC](https://meta.discourse.org/t/bulk-change-of-configuration-via-cli-in-multiple-user-profiles-preferences/162947/4 "2020-10-04T09:24:30Z")

</div>

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.
