# private\_messages\_group 中的路由大小写错误

**URL:** https://meta.discourse.org/t/route-capitalization-error-in-private-messages-group/171028
**Category:** Bug
**Created:** [2020年十一月23日 15:45 UTC](https://meta.discourse.org/t/route-capitalization-error-in-private-messages-group/171028 "2020-11-23T15:45:56Z")
**Posts on this page:** 5
**Page:** 1

<div class="post-metadata">

### Author: ![RGJ](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/rgj/32/523185_2.png) [@RGJ](https://meta.discourse.org/u/RGJ)
#### Post date: [2020年十一月23日 15:45 UTC](https://meta.discourse.org/t/route-capitalization-error-in-private-messages-group/171028/1 "2020-11-23T15:45:56Z")

</div>

我对群组私有收件箱不太熟悉，也不确定如何复现此问题，但出现了以下情况：

- 已为某个群组（我们称之为 ExampleGroup）设置了私有消息收件箱。
- 该群组成员收到通知：“您的 examplegroup 收件箱中有 6 条消息”。
- 点击该通知时，尝试加载 `/topics/private-messages-group/username/examplegroup.json`。
- 这导致报错。

我认为这是因为系统中没有名为 `examplegroup` 的群组，实际群组名称是 `ExampleGroup`。

`ListController::generate_message_route` 执行了以下操作：

`group = Group.find_by(name: params[:group_name])`

如果将其改为：

```
group = Group.find_by(name: params[:group_name])
group = Group.where('lower(name) = ?', params[:group_name].downcase).first unless group

```

似乎可以解决问题。但我相信这并非根本原因。我认为在某个地方，本不应被转换的参数被错误地转为了小写。

大家有什么建议，应该从哪里入手排查吗？

---

<div class="post-metadata">

### Author: ![angus](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/angus/32/341715_2.png) [@angus](https://meta.discourse.org/u/angus)
#### Post date: [2020年十一月25日 01:19 UTC](https://meta.discourse.org/t/route-capitalization-error-in-private-messages-group/171028/3 "2020-11-25T01:19:56Z")

</div>

如果你直接在控制台中创建通知，链接会保留大小写（即使数据是假的也能正常工作）

```ruby
Notification.create!(
  user_id: 1,
  notification_type: Notification.types[:group_message_summary],
  data: { inbox_count: 5, group_name: "MyGroup", group_id: 41, username: 'angus' }.to_json
)

```

 ![Screenshot at Nov 25 12-14-44](https://global.discourse-cdn.com/meta/original/3X/c/0/c0105c63333e8d047b815e4a984859c0220088d2.jpeg)

问题可能出在创建端，也就是帖子提醒器中：[discourse/app/services/post\_alerter.rb at main · discourse/discourse · GitHub](https://github.com/discourse/discourse/blob/master/app/services/post_alerter.rb#L252)

不过，我似乎无法复现这个问题。

---

<div class="post-metadata">

### Author: ![RGJ](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/rgj/32/523185_2.png) [@RGJ](https://meta.discourse.org/u/RGJ)
#### Post date: [2020年十一月25日 06:19 UTC](https://meta.discourse.org/t/route-capitalization-error-in-private-messages-group/171028/4 "2020-11-25T06:19:56Z")

</div>

感谢您的帮助！但那个链接不正确，不是 `/u/username/messages/group/groupname`，而是 `/topics/private-messages-group/username/groupname`。我找不到后者是从哪里来的，也不知道如何生成它。

---

<div class="post-metadata">

### Author: ![techAPJ](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/techapj/32/342990_2.png) [@techAPJ](https://meta.discourse.org/u/techAPJ)
#### Post date: [2021年四月20日 05:00 UTC](https://meta.discourse.org/t/route-capitalization-error-in-private-messages-group/171028/5 "2021-04-20T05:00:01Z")

</div>

我认为正确的修复方案是_不_要求 URL 参数中的群组名称大写。已通过以下方式完成：

> <https://github.com/discourse/discourse/commit/af6d0342b642feac3a5e359d13c854d2a80145b6>

> [@RGJ](#):
>
> 它不是 `/u/username/messages/group/groupname`，  
> 而是 `/topics/private-messages-group/username/groupname`。

请注意，访问 `/u/username/messages/group/groupname` 会触发一个 AJAX 请求到 `/topics/private-messages-group/username/groupname`，因此 @angus 上面为调试此问题所采取的操作看起来是正确的。

感谢报告此问题 @RGJ 👍

---

<div class="post-metadata">

### Author: ![techAPJ](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/techapj/32/342990_2.png) [@techAPJ](https://meta.discourse.org/u/techAPJ)
#### Post date: [2021年四月20日 06:48 UTC](https://meta.discourse.org/t/route-capitalization-error-in-private-messages-group/171028/6 "2021-04-20T06:48:14Z")

</div>


