# 类别错误：可见性受限及/或子类别

**URL:** https://meta.discourse.org/t/error-with-categories-with-limited-visibility-and-or-subcategories/284150
**Category:** Bug
**Created:** [2023年十一月1日 19:40 UTC](https://meta.discourse.org/t/error-with-categories-with-limited-visibility-and-or-subcategories/284150 "2023-11-01T19:40:17Z")
**Posts on this page:** 16
**Page:** 1

<div class="post-metadata">

### Author: ![Jagster](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/jagster/32/192154_2.png) [@Jagster](https://meta.discourse.org/u/Jagster)
#### Post date: [2023年十一月1日 19:40 UTC](https://meta.discourse.org/t/error-with-categories-with-limited-visibility-and-or-subcategories/284150/1 "2023-11-01T19:40:17Z")

</div>

我也是，我今天也升级了。所以是在 Discourse 里？

 ![IMG_2252](https://global.discourse-cdn.com/meta/original/4X/9/6/d/96d9b5501def2194c1e638f30ba4b855be718771.jpeg)

现在我再深入研究一下。

---

<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: [2023年十一月1日 19:41 UTC](https://meta.discourse.org/t/error-with-categories-with-limited-visibility-and-or-subcategories/284150/2 "2023-11-01T19:41:53Z")

</div>

嗯，你的问题是服务器端错误 @Jagster 我认为那是不同的问题。另外，这个更改尚未合并，因此不应影响自托管网站。

---

<div class="post-metadata">

### Author: ![Jagster](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/jagster/32/192154_2.png) [@Jagster](https://meta.discourse.org/u/Jagster)
#### Post date: [2023年十一月1日 19:44 UTC](https://meta.discourse.org/t/error-with-categories-with-limited-visibility-and-or-subcategories/284150/3 "2023-11-01T19:44:13Z")

</div>

确实如此，但我已登录。OP 的错误是针对匿名用户的。而且，在这两种情况下，它都发生在类别上。

---

<div class="post-metadata">

### Author: ![Jagster](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/jagster/32/192154_2.png) [@Jagster](https://meta.discourse.org/u/Jagster)
#### Post date: [2023年十一月1日 19:49 UTC](https://meta.discourse.org/t/error-with-categories-with-limited-visibility-and-or-subcategories/284150/4 "2023-11-01T19:49:20Z")

</div>

来自 Discourse：

`HasCustomFields::NotPreloadedError (尝试访问“Category”类上未预加载的自定义字段“sort_topics_by_event_start_date”。`

和

```plaintext
Message

HasCustomFields::NotPreloadedError (尝试访问“Category”类上未预加载的自定义字段“sort_topics_by_event_start_date”。为防止 N+1 查询，这是不允许的。)
app/models/concerns/has_custom_fields.rb:203:in `[]'
(eval):47:in `_fast_attributes'
lib/freedom_patches/ams_include_without_root.rb:57:in `include!'
lib/freedom_patches/ams_include_without_root.rb:57:in `include!'
app/controllers/application_controller.rb:531:in `serialize_data'
app/controllers/application_controller.rb:540:in `render_serialized'
app/controllers/categories_controller.rb:408:in `categories_and_topics'
app/controllers/categories_controller.rb:99:in `categories_and_latest'
app/controllers/application_controller.rb:422:in `block in with_resolved_locale'
app/controllers/application_controller.rb:422:in `with_resolved_locale'
lib/middleware/omniauth_bypass_middleware.rb:64:in `call'
lib/middleware/content_security_policy/middleware.rb:12:in `call'
lib/middleware/anonymous_cache.rb:389:in `call'
lib/middleware/gtm_script_nonce_injector.rb:10:in `call'
config/initializers/100-quiet_logger.rb:20:in `call'
config/initializers/100-silence_logger.rb:29:in `call'
lib/middleware/enforce_hostname.rb:24:in `call'
lib/middleware/request_tracker.rb:233:in `call'

Backtrace

app/models/concerns/has_custom_fields.rb:203:in `[]'
plugins/discourse-calendar/plugin.rb:88:in `block (2 levels) in activate!'
(eval):47:in `_fast_attributes'
active_model_serializers (0.8.4) lib/active_model/serializer.rb:456:in `attributes'
active_model_serializers (0.8.4) lib/active_model/serializer.rb:480:in `_serializable_hash'
active_model_serializers (0.8.4) lib/active_model/serializer.rb:359:in `serializable_hash'
active_model_serializers (0.8.4) lib/active_model/serializer/associations.rb:124:in `block in serialize'
active_model_serializers (0.8.4) lib/active_model/serializer/associations.rb:123:in `map'
active_model_serializers (0.8.4) lib/active_model/serializer/associations.rb:123:in `serialize'
lib/freedom_patches/ams_include_without_root.rb:57:in `include!'

```

所以……接下来我应该禁用日历插件，对吗？

**编辑**

侧边栏上的分类链接可以正常工作，其他所有分类链接都会导致错误。

---

<div class="post-metadata">

### Author: ![Jagster](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/jagster/32/192154_2.png) [@Jagster](https://meta.discourse.org/u/Jagster)
#### Post date: [2023年十一月1日 20:14 UTC](https://meta.discourse.org/t/error-with-categories-with-limited-visibility-and-or-subcategories/284150/5 "2023-11-01T20:14:44Z")

</div>

我已将此错误缩小范围。仅当类别包含子类别时才会发生。`/categories` 也会导致 500 错误。

而且我仍然不确定这是否来自 Calender。如果是，这是安全模式无效的另一个案例吗？

但 Lockdown 会给出这个：

```plaintext
消息

HasCustomFields::NotPreloadedError (尝试访问“Category”类上未预加载的自定义字段“redirect_url”。为防止 N+1 查询，此操作被禁止。)
app/models/concerns/has_custom_fields.rb:203:in `[]'
(eval):49:in `_fast_attributes'
lib/freedom_patches/ams_include_without_root.rb:57:in `include!'
lib/freedom_patches/ams_include_without_root.rb:57:in `include!'
app/controllers/application_controller.rb:531:in `serialize_data'
app/controllers/application_controller.rb:540:in `render_serialized'
app/controllers/categories_controller.rb:408:in `categories_and_topics'
app/controllers/categories_controller.rb:99:in `categories_and_latest'
app/controllers/application_controller.rb:422:in `block in with_resolved_locale'
app/controllers/application_controller.rb:422:in `with_resolved_locale'
lib/middleware/omniauth_bypass_middleware.rb:64:in `call'
lib/middleware/content_security_policy/middleware.rb:12:in `call'
lib/middleware/anonymous_cache.rb:389:in `call'
lib/middleware/gtm_script_nonce_injector.rb:10:in `call'
config/initializers/100-quiet_logger.rb:20:in `call'
config/initializers/100-silence_logger.rb:29:in `call'
lib/middleware/enforce_hostname.rb:24:in `call'
lib/middleware/request_tracker.rb:233:in `call'

回溯

app/models/concerns/has_custom_fields.rb:203:in `[]'
plugins/discourse-category-lockdown/plugin.rb:18:in `block (2 levels) in activate!'
(eval):49:in `_fast_attributes'
active_model_serializers (0.8.4) lib/active_model/serializer.rb:468:in `rescue in attributes'
active_model_serializers (0.8.4) lib/active_model/serializer.rb:455:in `attributes'
active_model_serializers (0.8.4) lib/active_model/serializer.rb:480:in `_serializable_hash'
active_model_serializers (0.8.4) lib/active_model/serializer.rb:359:in `serializable_hash'
active_model_serializers (0.8.4) lib/active_model/serializer/associations.rb:124:in `block in serialize'
active_model_serializers (0.8.4) lib/active_model/serializer/associations.rb:123:in `map'
active_model_serializers (0.8.4) lib/active_model/serializer/associations.rb:123:in `serialize'

环境

HTTP HOSTS: foorumi.katiska.eu

```

所以我很确定这并非来自插件，而是来自 Discourse 本身，但同样，我不是开发人员。

---

<div class="post-metadata">

### Author: ![craigconstantine](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/craigconstantine/32/511195_2.png) [@craigconstantine](https://meta.discourse.org/u/craigconstantine)
#### Post date: [2023年十一月1日 20:55 UTC](https://meta.discourse.org/t/error-with-categories-with-limited-visibility-and-or-subcategories/284150/6 "2023-11-01T20:55:47Z")

</div>

我是 OP，我没有安装 Calendar 插件（我使用的是不支持该插件的托管 Discourse 级别）。

“子类别导致此问题”是可能的原因……我现在无法确定，因为我的网站上很多东西都坏了。但我确实刚刚创建了一个类别……所以如果（我不记得它是如何工作的）它默认将新类别放在“Public”下，那么我刚刚创建了我的第一个子类别（意外地）。

---

<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: [2023年十一月2日 04:40 UTC](https://meta.discourse.org/t/error-with-categories-with-limited-visibility-and-or-subcategories/284150/7 "2023-11-02T04:40:26Z")

</div>

> [@Jagster](#):
>
> 我仍然不确定它是否来自日历。

错误确实看起来是这样…… `sort_topics_by_event_start_date`……

这在这里注册：

> <https://github.com/discourse/discourse-calendar/blob/7e162ca3b5e976574edb4d6f5be07727e493a27e/plugin.rb#L83-L84>

以及分类在这里：

> <https://github.com/discourse/discourse-calendar/blob/7e162ca3b5e976574edb4d6f5be07727e493a27e/plugin.rb#L81-L82>

我有一种感觉，这可能是由于我们现在正在进行的分类可扩展性工作而导致的回归……我们会看看。

---

<div class="post-metadata">

### Author: ![AquaL1te](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/aqual1te/32/201966_2.png) [@AquaL1te](https://meta.discourse.org/u/AquaL1te)
#### Post date: [2023年十一月2日 10:33 UTC](https://meta.discourse.org/t/error-with-categories-with-limited-visibility-and-or-subcategories/284150/12 "2023-11-02T10:33:58Z")

</div>

太好了！这个问题已经被报告过了。我将把它留在这里，以便搜索效果更好。

```plaintext
while trying to load /categories.json)

```

---

<div class="post-metadata">

### Author: ![j.jaffeux](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/j.jaffeux/32/60297_2.png) [@j.jaffeux](https://meta.discourse.org/u/j.jaffeux)
#### Post date: [2023年十一月2日 12:04 UTC](https://meta.discourse.org/t/error-with-categories-with-limited-visibility-and-or-subcategories/284150/13 "2023-11-02T12:04:25Z")

</div>

我们正在调查此事。

---

<div class="post-metadata">

### Author: ![nbianca](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/nbianca/32/157984_2.png) [@nbianca](https://meta.discourse.org/u/nbianca)
#### Post date: [2023年十一月2日 12:10 UTC](https://meta.discourse.org/t/error-with-categories-with-limited-visibility-and-or-subcategories/284150/14 "2023-11-02T12:10:29Z")

</div>

> [@Jagster](#):
>
> ```plaintext
> HasCustomFields::NotPreloadedError (Attempted to access the non preloaded custom field 'sort_topics_by_event_start_date' on the 'Category' class. This is disallowed to prevent N+1 queries.)
> 
> ```

此问题由 discourse-calendar 引起，但该插件的最新版本（即将发布）应能解决此问题：

> <https://github.com/discourse/discourse-calendar/pull/472>

> [@Jagster](#):
>
> ```plaintext
> HasCustomFields::NotPreloadedError (Attempted to access the non preloaded custom field 'redirect_url' on the 'Category' class. This is disallowed to prevent N+1 queries.)
> 
> ```

这是 discourse-category-lockdown 的一个问题，我们无法控制。不过我可以提交一个 PR 来解决它。

---

<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: [2023年十一月2日 12:31 UTC](https://meta.discourse.org/t/error-with-categories-with-limited-visibility-and-or-subcategories/284150/15 "2023-11-02T12:31:11Z")

</div>

> [@nbianca](#):
>
> 这是来自 discourse-category-lockdown 的一个问题。

进一步的问题跟踪请访问 [non preloaded custom field - Discourse Category Lockdown - Pavilion](https://coop.pavilion.tech/t/non-preloaded-custom-field/3162)

---

<div class="post-metadata">

### Author: ![Jagster](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/jagster/32/192154_2.png) [@Jagster](https://meta.discourse.org/u/Jagster)
#### Post date: [2023年十一月2日 12:35 UTC](https://meta.discourse.org/t/error-with-categories-with-limited-visibility-and-or-subcategories/284150/16 "2023-11-02T12:35:23Z")

</div>

是由于什么原因？所以，这两个插件都因为 X 原因出现了同样的 bug，还是 Discourse 更改了某些会影响到两者的内容？

不，我不是在责怪任何人，我只是想理解术语。

---

<div class="post-metadata">

### Author: ![nbianca](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/nbianca/32/157984_2.png) [@nbianca](https://meta.discourse.org/u/nbianca)
#### Post date: [2023年十一月2日 14:31 UTC](https://meta.discourse.org/t/error-with-categories-with-limited-visibility-and-or-subcategories/284150/17 "2023-11-02T14:31:14Z")

</div>

最近的性能改进导致了这个问题。自定义字段是我们代码库中的一种“独角兽”，可供各种插件用于扩展功能。但是，如果使用不当，可能会带来性能损失。此改进着眼于解决此问题：

> <https://github.com/discourse/discourse/commit/2a75656ff24ba750b19838e27e559828a3aaf719>
>
> This commit also introduced a plugin API for preloading category custom
> fields.

---

<div class="post-metadata">

### Author: ![nbianca](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/nbianca/32/157984_2.png) [@nbianca](https://meta.discourse.org/u/nbianca)
#### Post date: [2023年十一月2日 15:05 UTC](https://meta.discourse.org/t/error-with-categories-with-limited-visibility-and-or-subcategories/284150/19 "2023-11-02T15:05:46Z")

</div>

> [@RGJ](#):
>
> 在此处进一步跟踪问题 [non preloaded custom field - Discourse Category Lockdown - Coöperative](https://coop.pavilion.tech/t/non-preloaded-custom-field/3162)

我已经提交了一个 PR，但它不是我们有权访问的存储库：

> <https://github.com/paviliondev/discourse-category-lockdown/pull/16>

---

<div class="post-metadata">

### Author: ![AquaL1te](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/aqual1te/32/201966_2.png) [@AquaL1te](https://meta.discourse.org/u/AquaL1te)
#### Post date: [2023年十一月2日 17:03 UTC](https://meta.discourse.org/t/error-with-categories-with-limited-visibility-and-or-subcategories/284150/20 "2023-11-02T17:03:11Z")

</div>

我看到它已经合并了，我进行了重新构建，它解决了这个问题 🎉 感谢您一如既往的快速修复。

---

<div class="post-metadata">

### Author: ![Jagster](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/jagster/32/192154_2.png) [@Jagster](https://meta.discourse.org/u/Jagster)
#### Post date: [2023年十一月2日 17:39 UTC](https://meta.discourse.org/t/error-with-categories-with-limited-visibility-and-or-subcategories/284150/21 "2023-11-02T17:39:21Z")

</div>

好的。运行得很顺利。非常感谢。

Category Lockdown 会给出永恒的旋转器（嗯，这个问题也可能来自 Firefox/iPad 的隐身模式）。但我想这是另一个问题。
