# \`NoMethodError in TopicsController#show\` 错误，合并主题后

**URL:** <https://meta.discourse.org/t/nomethoderror-in-topicscontroller-show-error-after-merging-topics/371843>\
**Category:** Bug\
**Tags:** pr-welcome, events, fixed\
**Created:** [2025年六月26日 15:58 UTC](https://meta.discourse.org/t/nomethoderror-in-topicscontroller-show-error-after-merging-topics/371843 "2025-06-26T15:58:31Z")\
**Posts on this page:** 1\
**Showing post:** 1

<div class="post-metadata">

**Author:** ![blu3id](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/blu3id/32/509663_2.png) [@blu3id](https://meta.discourse.org/u/blu3id)\
**Post date:** [2025年六月26日 15:58 UTC](https://meta.discourse.org/t/nomethoderror-in-topicscontroller-show-error-after-merging-topics/371843/1 "2025-06-26T15:58:31Z")

</div>

**优先级/严重性** : 低优先级 / 高严重性

**平台** : `3.5.0.beta8-dev` 和 `Discourse Calendar (and Event) - 0.5 0162ed5`

**描述** :

合并主题并删除已合并的帖子后，目标主题将因服务器错误而无法访问（`[NoMethodError: undefined method 'category_id' for nil]`）。

预期主题将正常运行，不会导致服务器错误。

> **Full trace**
>
> ```plaintext
> plugins/discourse-calendar/app/serializers/discourse_post_event/event_serializer.rb:137:in `category_id'
> (eval at /home/discourse/.bundle/gems/ruby/3.3.0/gems/active_model_serializers-0.8.4/lib/active_model/serializer.rb:467):5: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.rb:347:in `as_json'
> activesupport (7.2.2.1) lib/active_support/json/encoding.rb:23:in `encode'
> activesupport (7.2.2.1) lib/active_support/json/encoding.rb:23:in `encode'
> activesupport (7.2.2.1) lib/active_support/core_ext/object/json.rb:42:in `to_json'
> active_model_serializers (0.8.4) lib/active_model/serializer.rb:331:in `to_json'
> multi_json (1.15.0) lib/multi_json/adapters/oj.rb:56:in `dump'
> multi_json (1.15.0) lib/multi_json/adapters/oj.rb:56:in `dump'
> multi_json (1.15.0) lib/multi_json/adapter.rb:25:in `dump'
> multi_json (1.15.0) lib/multi_json.rb:139:in `dump'
> app/controllers/topics_controller.rb:1383:in `block (2 levels) in perform_show_response'
> actionpack (7.2.2.1) lib/action_controller/metal/mime_responds.rb:224:in `respond_to'
> app/controllers/topics_controller.rb:1377:in `perform_show_response'
> app/controllers/topics_controller.rb:191:in `show'
> actionpack (7.2.2.1) lib/action_controller/metal/basic_implicit_render.rb:8:in `send_action'
> actionpack (7.2.2.1) lib/abstract_controller/base.rb:226:in `process_action'
> actionpack (7.2.2.1) lib/action_controller/metal/rendering.rb:193:in `process_action'
> actionpack (7.2.2.1) lib/abstract_controller/callbacks.rb:261:in `block in process_action'
> activesupport (7.2.2.1) lib/active_support/callbacks.rb:121:in `block in run_callbacks'
> app/controllers/application_controller.rb:428:in `block in with_resolved_locale'
> i18n (1.14.7) lib/i18n.rb:353:in `with_locale'
> app/controllers/application_controller.rb:428:in `with_resolved_locale'
> activesupport (7.2.2.1) lib/active_support/callbacks.rb:130:in `block in run_callbacks'
> activesupport (7.2.2.1) lib/active_support/callbacks.rb:141:in `run_callbacks'
> actionpack (7.2.2.1) lib/abstract_controller/callbacks.rb:260:in `process_action'
> actionpack (7.2.2.1) lib/action_controller/metal/rescue.rb:27:in `process_action'
> actionpack (7.2.2.1) lib/action_controller/metal/instrumentation.rb:77:in `block in process_action'
> activesupport (7.2.2.1) lib/active_support/notifications.rb:210:in `block in instrument'
> activesupport (7.2.2.1) lib/active_support/notifications/instrumenter.rb:58:in `instrument'
> activesupport (7.2.2.1) lib/active_support/notifications.rb:210:in `instrument'
> actionpack (7.2.2.1) lib/action_controller/metal/instrumentation.rb:76:in `process_action'
> actionpack (7.2.2.1) lib/action_controller/metal/params_wrapper.rb:259:in `process_action'
> activerecord (7.2.2.1) lib/active_record/railties/controller_runtime.rb:39:in `process_action'
> actionpack (7.2.2.1) lib/abstract_controller/base.rb:163:in `process'
> actionview (7.2.2.1) lib/action_view/rendering.rb:40:in `process'
> rack-mini-profiler (4.0.0) lib/mini_profiler/profiling_methods.rb:116:in `block in profile_method'
> actionpack (7.2.2.1) lib/action_controller/metal.rb:252:in `dispatch'
> actionpack (7.2.2.1) lib/action_controller/metal.rb:335:in `dispatch'
> actionpack (7.2.2.1) lib/action_dispatch/routing/route_set.rb:67:in `dispatch'
> actionpack (7.2.2.1) lib/action_dispatch/routing/route_set.rb:50:in `serve'
> actionpack (7.2.2.1) lib/action_dispatch/journey/router.rb:53:in `block in serve'
> actionpack (7.2.2.1) lib/action_dispatch/journey/router.rb:133:in `block in find_routes'
> actionpack (7.2.2.1) lib/action_dispatch/journey/router.rb:126:in `each'
> actionpack (7.2.2.1) lib/action_dispatch/journey/router.rb:126:in `find_routes'
> actionpack (7.2.2.1) lib/action_dispatch/journey/router.rb:34:in `serve'
> actionpack (7.2.2.1) lib/action_dispatch/routing/route_set.rb:896:in `call'
> lib/middleware/omniauth_bypass_middleware.rb:35:in `call'
> rack (2.2.17) lib/rack/tempfile_reaper.rb:15:in `call'
> rack (2.2.17) lib/rack/conditional_get.rb:27:in `call'
> rack (2.2.17) lib/rack/head.rb:12:in `call'
> actionpack (7.2.2.1) lib/action_dispatch/http/permissions_policy.rb:38:in `call'
> lib/content_security_policy/middleware.rb:12:in `call'
> lib/middleware/csp_script_nonce_injector.rb:12:in `call'
> config/initializers/008-rack-cors.rb:14:in `call'
> rack (2.2.17) lib/rack/session/abstract/id.rb:266:in `context'
> rack (2.2.17) lib/rack/session/abstract/id.rb:260:in `call'
> actionpack (7.2.2.1) lib/action_dispatch/middleware/cookies.rb:704:in `call'
> activerecord (7.2.2.1) lib/active_record/migration.rb:674:in `call'
> actionpack (7.2.2.1) lib/action_dispatch/middleware/callbacks.rb:31:in `block in call'
> activesupport (7.2.2.1) lib/active_support/callbacks.rb:101:in `run_callbacks'
> actionpack (7.2.2.1) lib/action_dispatch/middleware/callbacks.rb:30:in `call'
> actionpack (7.2.2.1) lib/action_dispatch/middleware/executor.rb:16:in `call'
> actionpack (7.2.2.1) lib/action_dispatch/middleware/actionable_exceptions.rb:18:in `call'
> actionpack (7.2.2.1) lib/action_dispatch/middleware/debug_exceptions.rb:31:in `call'
> actionpack (7.2.2.1) lib/action_dispatch/middleware/show_exceptions.rb:32:in `call'
> logster (2.20.1) lib/logster/middleware/reporter.rb:40:in `call'
> lib/middleware/default_headers.rb:13:in `call'
> railties (7.2.2.1) lib/rails/rack/logger.rb:41:in `call_app'
> railties (7.2.2.1) lib/rails/rack/logger.rb:29:in `call'
> config/initializers/100-quiet_logger.rb:20:in `call'
> config/initializers/100-silence_logger.rb:29:in `call'
> actionpack (7.2.2.1) lib/action_dispatch/middleware/remote_ip.rb:96:in `call'
> actionpack (7.2.2.1) lib/action_dispatch/middleware/request_id.rb:33:in `call'
> rack (2.2.17) lib/rack/method_override.rb:24:in `call'
> actionpack (7.2.2.1) lib/action_dispatch/middleware/executor.rb:16:in `call'
> actionpack (7.2.2.1) lib/action_dispatch/middleware/static.rb:27:in `call'
> rack (2.2.17) lib/rack/sendfile.rb:110:in `call'
> lib/middleware/missing_avatars.rb:22:in `call'
> actionpack (7.2.2.1) lib/action_dispatch/middleware/host_authorization.rb:143:in `call'
> rack-mini-profiler (4.0.0) lib/mini_profiler.rb:334:in `call'
> lib/middleware/processing_request.rb:12:in `call'
> message_bus (4.4.1) lib/message_bus/rack/middleware.rb:60:in `call'
> railties (7.2.2.1) lib/rails/engine.rb:535:in `call'
> railties (7.2.2.1) lib/rails/railtie.rb:226:in `public_send'
> railties (7.2.2.1) lib/rails/railtie.rb:226:in `method_missing'
> rack (2.2.17) lib/rack/urlmap.rb:74:in `block in call'
> rack (2.2.17) lib/rack/urlmap.rb:58:in `each'
> rack (2.2.17) lib/rack/urlmap.rb:58:in `call'
> unicorn (6.1.0) lib/unicorn/http_server.rb:634:in `process_client'
> unicorn (6.1.0) lib/unicorn/http_server.rb:739:in `worker_loop'
> unicorn (6.1.0) lib/unicorn/http_server.rb:547:in `spawn_missing_workers'
> unicorn (6.1.0) lib/unicorn/http_server.rb:143:in `start'
> unicorn (6.1.0) bin/unicorn:128:in `\u003ctop (required)\u003e'
> bin/unicorn:96:in `load'
> bin/unicorn:96:in `block in \u003cmain\u003e'
> bin/unicorn:95:in `fork'
> bin/unicorn:95:in `\u003cmain\u003e'
> 
> ```

**重现步骤** :

在启用 `Discourse Calendar (and Event) - 0.5 0162ed5` 的 `3.5.0.beta8-dev` 上：

1. 以 `tl1` 身份的 `user1` 创建一个新主题 `topic 1 - that will be deleted`，其中包含一个帖子。
2. 创建新主题 `topic 2 - that will break`，其中包含一个帖子，确保该帖子包含 `Calendar Event`。
3. 以 `user1` 的身份删除 `topic 1 - that will be deleted` 中的帖子，锁定该主题并将您的帖子替换为“（帖子已被作者删除）”。
4. 以具有 `moderator` 权限的 `user2` 身份：
5. 选择 `topic 1 - that will be deleted` 中的帖子，然后选择第一个（已删除）帖子
6. 以 `user2` 的身份删除 `topic 2 - that will break` 中新合并的第一个帖子（该帖子显示“（帖子已被作者删除）”），这将导致 `topic 2 - that will break` 崩溃并抛出上述错误。

变通方法 - 禁用 #calendar-and-event 插件。这将允许您访问损坏的主题并取消删除第一个帖子。然后重新启用该插件。

**讨论:**

这也发现了 Discourse 中一个不太严重的错误，即在禁用 #calendar-and-event 插件的情况下执行上述操作将导致主题未被列出 - 请参阅单独的错误报告

---

_[View the full topic](https://meta.discourse.org/t/nomethoderror-in-topicscontroller-show-error-after-merging-topics/371843)._
