# 提交自定义内容标志（require\_message 标志）时出现 TypeError

**URL:** https://meta.discourse.org/t/typeerror-when-submitting-a-flag-with-custom-content-require-message-flags/403133
**Category:** Bug
**Tags:** fixed
**Created:** [2026年五月16日 02:45 UTC](https://meta.discourse.org/t/typeerror-when-submitting-a-flag-with-custom-content-require-message-flags/403133 "2026-05-16T02:45:08Z")
**Posts on this page:** 11
**Page:** 1

<div class="post-metadata">

### Author: ![cuo\_wu](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/cuo_wu/32/498442_2.png) [@cuo\_wu](https://meta.discourse.org/u/cuo_wu)
#### Post date: [2026年五月16日 02:45 UTC](https://meta.discourse.org/t/typeerror-when-submitting-a-flag-with-custom-content-require-message-flags/403133/1 "2026-05-16T02:45:09Z")

</div>

**Bug 描述**

当用户选择需要自定义消息的旗帜类型（例如 `notify_moderators`、`notify_user`，或任何在后台启用“需要消息”选项的管理员自定义旗帜），填写消息并提交时，浏览器会抛出未捕获的 TypeError，且旗帜从未被提交。

**复现步骤**

1. 访问任意主题帖子
2. 点击旗帜按钮以打开旗帜弹窗
3. 选择一个需要消息的旗帜类型（例如“其他事项”/ `notify_moderators`，或在 管理 → 旗帜 中创建的任何启用“需要消息”的自定义旗帜）
4. 在文本区域中输入消息（长度需满足最低要求）
5. 点击提交按钮

**预期行为**

旗帜成功提交。

**实际行为**

旗帜弹窗关闭，但旗帜未被提交。浏览器控制台显示：

```plaintext
Uncaught (in promise) TypeError: Cannot read properties of undefined (reading 'act')
    at n.create (flag.js:24:8)
    at S.createFlag (flag.gjs:205:32)
    at S.takeAction (flag.gjs:196:12)
    at m.perform (reviewable-bundled-action.gjs:47:17)
    at ej._boundaryActionHandler (select-kit.js:685:34)
    ...

```

**根本原因分析**

崩溃起源于 `Flag#create`（`flag.js:24`）：

```js
create(flagModal, opts) {
  const postAction = this.postActionFor(flagModal); // 返回 undefined
  // ...
  postAction.act(...) // ← TypeError: Cannot read properties of undefined
}

```

`PostFlag` 中的 `postActionFor` 方法在 `actions_summary` 中通过数字 `id` 查找所选旗帜：

```js
// post-flag.js
postActionFor(flagModal) {
  return flagModal.args.model.flagModel.actions_summary.find(
    (item) => item.id === flagModal.selected.id
  );
}

```

后端 `PostSerializer` 仅在 `can_act`、`count` 或 `acted` 中至少有一个为真值时，才会在 `actions_summary` 中包含旗帜条目：

```ruby
result << summary if summary[:can_act] || summary[:count] || summary[:acted]

```

对于 `require_message: true` 的旗帜（均为 `notify_type: true`），当 `already_did_flagging` 为真（即用户之前已在该帖子提交过任何通知类旗帜）时，`post_can_act?` 会将 `can_act` 设置为 `false`。此时该条目不会出现在 `actions_summary` 中，导致 `postActionFor` 返回 `undefined`，进而引发崩溃。

与此同时，控制用户在 UI 中可选择内容的 `Post#flagsAvailable` 使用的是页面加载时构建的 `actionByName` 映射，因此即使 `actions_summary` 中不再包含该条目，旗帜仍可能显示为可选。

**次要 Bug**

`flag.gjs` 中还存在一个错误的比较：

```js
const NOTIFY_MODERATORS_KEY = "notify_moderators"; // 字符串

get notifyModeratorsFlag() {
  return this.flagsAvailable.find((f) => f.id === NOTIFY_MODERATORS_KEY);
  // ^ 数字 ^ 字符串 — 始终为 false
}

```

`f.id` 是数字，而 `NOTIFY_MODERATORS_KEY` 是字符串，因此 `===` 始终返回 `false`，导致 `notifyModeratorsFlag` 始终为 `undefined`。这破坏了 `flagForReview()` 中“标记以供审查”按钮的逻辑。

**建议修复方案**

`PostFlag#postActionFor` 应使用 `actionByName` 映射（以 `name_key` 为键），而不是通过 `id` 搜索 `actions_summary`，这与 `TopicFlag#postActionFor` 的现有实现方式保持一致：

```js
// post-flag.js
postActionFor(flagModal) {
  return flagModal.args.model.flagModel.actionByName[
    flagModal.selected.name_key
  ];
}

```

同时，`notifyModeratorsFlag` 应改为通过 `name_key` 进行比较：

```js
get notifyModeratorsFlag() {
  return this.flagsAvailable.find((f) => f.name_key === NOTIFY_MODERATORS_KEY);
}

```

**Discourse 版本**

### 2026.5.0-latest

**可复现于**

- 最新的 `main` 分支

---

<div class="post-metadata">

### Author: ![sam](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/sam/32/102149_2.png) [@sam](https://meta.discourse.org/u/sam)
#### Post date: [2026年五月18日 01:29 UTC](https://meta.discourse.org/t/typeerror-when-submitting-a-flag-with-custom-content-require-message-flags/403133/2 "2026-05-18T01:29:34Z")

</div>

感谢反馈，我们会查看。如果您愿意，也欢迎直接提交 PR。

---

<div class="post-metadata">

### Author: ![tgxworld](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/tgxworld/32/106117_2.png) [@tgxworld](https://meta.discourse.org/u/tgxworld)
#### Post date: [2026年五月19日 03:19 UTC](https://meta.discourse.org/t/typeerror-when-submitting-a-flag-with-custom-content-require-message-flags/403133/4 "2026-05-19T03:19:36Z")

</div>

> [@cuo\_wu](#):
>
> **复现步骤**
> 
> 1. 访问任意主题帖子
> 2. 点击旗帜按钮以打开旗帜弹窗
> 3. 选择一个需要填写消息的旗帜类型（例如“其他”/ `notify_moderators`，或在 管理 → 旗帜 中创建的启用了“需要消息”的自定义旗帜）
> 4. 在文本区域中输入一条消息（长度需满足最低要求）
> 5. 点击提交按钮

我尝试在本地复现但未成功。如果您启用 [安全模式](https://meta.discourse.org/t/using-safe-mode-to-troubleshoot-issues-with-themes-and-plugins/53504)，能否复现此问题？

---

<div class="post-metadata">

### Author: ![Moin](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/moin/32/554653_2.png) [@Moin](https://meta.discourse.org/u/Moin)
#### Post date: [2026年五月19日 06:04 UTC](https://meta.discourse.org/t/typeerror-when-submitting-a-flag-with-custom-content-require-message-flags/403133/5 "2026-05-19T06:04:45Z")

</div>

> [@cuo\_wu](#):
>
> 对于 `require_message: true` 的标志（它们都是 `notify_type: true`），当 `already_did_flagging` 为 `true` 时，`post_can_act?` 会将 `can_act` 设置为 `false`——即用户此前已对该帖子提交过任何通知类标志。在这种情况下，`actions_summary` 中将不存在该条目，`postActionFor` 返回 `undefined`，随后便发生崩溃。

我认为仅对主题进行一次标志操作不会导致此问题，因为此时 `already_did_flagging` 应为 `false`。通常无法对同一帖子再次进行标志操作。但在以“其他事项”进行标志后，仍可以以“非法”为由再次标志。此情况下的结果如下：

 ![Screenshot_20260519_074906_Firefox](https://global.discourse-cdn.com/meta/original/4X/3/1/8/318fd455f77ab9d61189b91a051e8cd99c3dd38a.jpeg)

---

<div class="post-metadata">

### Author: ![Moin](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/moin/32/554653_2.png) [@Moin](https://meta.discourse.org/u/Moin)
#### Post date: [2026年五月19日 06:17 UTC](https://meta.discourse.org/t/typeerror-when-submitting-a-flag-with-custom-content-require-message-flags/403133/6 "2026-05-19T06:17:48Z")

</div>

现在我成功复现了问题：

 ![image(20)](https://global.discourse-cdn.com/meta/original/4X/8/7/4/8745d5038172bf85b92c3e54df0e1df366d1dd1f.png)

虽然通常无法对同一帖子重复举报，但在嵌套话题中似乎有所不同。因此：

1. 创建一个包含若干嵌套回复的话题
2. 将该回复标记为“其他”并提交举报
3. 再次点击举报图标  
**预期结果** ：仅显示“内容违法”选项，与未启用嵌套模式的帖子中的情况一致。  
**实际结果** ：除“其他”之外的所有举报原因均可用。
4. 选择另一个原因，提交举报并检查浏览器控制台

---

<div class="post-metadata">

### Author: ![tannerabread](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/tannerabread/32/526153_2.png) [@tannerabread](https://meta.discourse.org/u/tannerabread)
#### Post date: [2026年七月21日 17:14 UTC](https://meta.discourse.org/t/typeerror-when-submitting-a-flag-with-custom-content-require-message-flags/403133/7 "2026-07-21T17:14:55Z")

</div>

迟到了，但我现在正在处理这个问题。

> [@Moin](#):
>
> 1. **预期结果** ：就像在非嵌套模式的帖子中一样，仅显示“非法”选项。

即使在非嵌套模式下，我也看不到“非法”选项。我已经更新了嵌套模式以匹配非嵌套主题的行为，但当你再次尝试举报时，两者最终都显示如下：

 ![image](https://global.discourse-cdn.com/meta/original/4X/c/e/9/ce95579180201c6cb24d744118b453fb3c3d4f6b.png)

---

<div class="post-metadata">

### Author: ![Moin](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/moin/32/554653_2.png) [@Moin](https://meta.discourse.org/u/Moin)
#### Post date: [2026年七月21日 18:03 UTC](https://meta.discourse.org/t/typeerror-when-submitting-a-flag-with-custom-content-require-message-flags/403133/8 "2026-07-21T18:03:06Z")

</div>

我刚刚在一个没有嵌套回复的主题上按照上述步骤操作。

正如您在下面的模态窗口中所见，该帖子已被用户标记为待审核，再次点击标记模态窗口会导致：

 ![Screenshot_20260721_195643_Firefox](https://global.discourse-cdn.com/meta/original/4X/a/f/8/af8dcd5e4c7bca6079c91525141746011f170dcb.jpeg)

* * *

查看我的站点设置，`allow_all_users_to_flag_illegal_content` 可能就是允许用户在选择了其他选项后仍能将内容标记为“非法”的原因。

---

<div class="post-metadata">

### Author: ![tannerabread](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/tannerabread/32/526153_2.png) [@tannerabread](https://meta.discourse.org/u/tannerabread)
#### Post date: [2026年七月21日 18:57 UTC](https://meta.discourse.org/t/typeerror-when-submitting-a-flag-with-custom-content-require-message-flags/403133/9 "2026-07-21T18:57:30Z")

</div>

> [@Moin](#):
>
> allow\_all\_users\_to\_flag\_illegal\_content

啊，这就解决了，谢谢！修复补丁应该很快就会发布。

---

<div class="post-metadata">

### Author: ![tannerabread](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/tannerabread/32/526153_2.png) [@tannerabread](https://meta.discourse.org/u/tannerabread)
#### Post date: [2026年七月21日 21:14 UTC](https://meta.discourse.org/t/typeerror-when-submitting-a-flag-with-custom-content-require-message-flags/403133/13 "2026-07-21T21:14:32Z")

</div>

主要 bug 的修复已包含在 `latest` 中，应该能解决这个问题。也就是说，它应该与非嵌套主题回复保持一致。

* * *

> [@cuo\_wu](#):
>
> **次要 bug**
> 
> `flag.gjs` 中还有一个损坏的比较：

我决定将其分开，因为它的行为不同，并且很快也会修复这个问题。

---

<div class="post-metadata">

### Author: ![tannerabread](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/tannerabread/32/526153_2.png) [@tannerabread](https://meta.discourse.org/u/tannerabread)
#### Post date: [2026年七月23日 17:46 UTC](https://meta.discourse.org/t/typeerror-when-submitting-a-flag-with-custom-content-require-message-flags/403133/14 "2026-07-23T17:46:00Z")

</div>

后续更新也已合并。那个有问题的比较实际上对我们有利——如果正确修复了比较，管理员/版主就可以在不提供理由的情况下提交标记。我们希望提交标记时必须提供理由，因此我删除了相关代码，而不是修复它，以避免将来产生混淆。

---

<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: [2026年七月25日 18:11 UTC](https://meta.discourse.org/t/typeerror-when-submitting-a-flag-with-custom-content-require-message-flags/403133/16 "2026-07-25T18:11:50Z")

</div>


