`NoMethodError in TopicsController#show` خطأ بعد دمج المواضيع

الأولوية/الخطورة: أولوية منخفضة / خطورة عالية

المنصة: 3.5.0.beta8-dev مع Discourse Calendar (and Event) - 0.5 0162ed5

الوصف:

بعد دمج المواضيع وحذف منشور مدمج، يصبح الموضوع الهدف غير متاح بسبب خطأ في الخادم ([NoMethodError: undefined method 'category_id' for nil]).

من المتوقع أن يعمل الموضوع بشكل طبيعي ولا يسبب خطأ في الخادم.

تتبع كامل
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'

خطوات قابلة للتكرار:

على 3.5.0.beta8-dev مع تمكين Discourse Calendar (and Event) - 0.5 0162ed5:

  1. قم بإنشاء موضوع جديد الموضوع 1 - الذي سيتم حذفه بمنشور واحد كـ user1 وهو tl1
  2. قم بإنشاء موضوع جديد الموضوع 2 - الذي سيتعطل بمنشور واحد وتأكد من أن Calendar Event جزء من هذا المنشور.
  3. بصفتك user1، احذف منشورك في الموضوع 1 - الذي سيتم حذفه مما يؤدي إلى قفل الموضوع واستبدال منشورك بـ “(تم حذف الموضوع بواسطة المؤلف)”
  4. بصفتك user2 الذي لديه صلاحيات moderator:
  5. حدد المنشورات في الموضوع 1 - الذي سيتم حذفه وحدد المنشور الأول (المحذوف الآن)
  6. بصفتك user2، احذف المنشور الأول المدمج حديثًا في الموضوع 2 - الذي سيتعطل (المنشور الذي تم دمجه للتو ويقرأ “(تم حذف الموضوع بواسطة المؤلف)”) سيؤدي هذا إلى تعطل الموضوع 2 - الذي سيتعطل وإظهار الخطأ المذكور أعلاه.

حل بديل - قم بتعطيل المكون الإضافي calendar-and-event. سيتيح لك هذا زيارة الموضوع المعطل واستعادة المنشور الأول. ثم أعد تمكين المكون الإضافي.

مناقشة:

حدد هذا أيضًا خطأ أقل حدة في Discourse حيث يؤدي تنفيذ ما سبق مع تعطيل المكون الإضافي calendar-and-event إلى جعل الموضوع غير مدرج - راجع تقرير خطأ منفصل

إعجابَين (2)

شكراً جزيلاً على هذا الشرح المفصل. أتفق على أنه يجب علينا تنظيف هذا الأمر، سأضع علامة pr-welcome عليه في الوقت الحالي.

إعجاب واحد (1)

شكراً لكما على التقرير المفصل والمتابعة. لقد واجهت مشكلة مماثلة بعد دمج المواضيع مع أحداث التقويم ولم أتمكن من معرفة سبب تعطل الموضوع. يسعدني أن أرى أن هذا موثق.

سأراقب أي طلبات سحب (PRs) لهذا. في غضون ذلك، من المفيد معرفة أن تعطيل المكون الإضافي مؤقتًا كحل بديل. أخبرني إذا كان هناك أي شيء يمكنني المساعدة في اختباره.

على كل حال، أعتقد أنه يمكنني تبسيط إعادة الإنتاج:

  • تمكين كل من التقويم ممكّن و حدث منشور Discourse ممكّن
  • بصفتك مسؤولاً، قم بإنشاء الموضوع 1
  • بصفتك مسؤولاً، قم بإنشاء الموضوع 2 وقم بتضمين حدث منشور باستخدام ‘إنشاء حدث’ من قائمة المنشئ التي تحتوي على دائرة مع علامة زائد
  • بصفتك مسؤولاً، انتقل إلى الموضوع 1 واستخدم مفتاح ربط الموضوع لتحديد المنشور الأصلي ودمجه في الموضوع 2 مع تحديد خيار ‘الحفاظ على الترتيب الزمني بعد الدمج’

في هذه المرحلة، لم يعد حدث المنشور هو المنشور الأصلي للموضوع 2

  • بصفتك مسؤولاً، قم بحذف الموضوع 2 باستخدام إما حذف المنشور الأصلي أو خيار حذف الموضوع

النتيجة: تعطل كامل. الموضوع المحذوف غير قابل للوصول. خطأ في /logs وهو NoMethodError (undefined method ‘category_id’ for nil)


هل سيكون الإصلاح هنا هو منع الدمج الذي سيستبدل الحدث كالمنشور الأصلي؟

عند محاولة دمج منشور حدث (واحد موضوع بشكل صحيح في منشور أصلي) في موضوع آخر، يتم حظره مع ظهور هذا في السجلات:

فشل في معالجة الاستجابة المختطفة بشكل صحيح : ActiveRecord::RecordNotSaved : لا يمكن أن يكون الحدث إلا في المنشور الأول للموضوع

(خطأ واجهة المستخدم أكثر عمومية، وهو ‘حدث خطأ أثناء نقل المنشورات.’، وسيكون من الجيد لو كان أكثر تفصيلاً)

هل يمكن تطبيق شيء مماثل لمنع دمج ينقل الحدث من موضع المنشور الأصلي؟

3 إعجابات