Errore `NoMethodError in TopicsController#show` dopo aver unito gli argomenti

Priorità/Gravità: Bassa Priorità / Alta Gravità

Piattaforma: 3.5.0.beta8-dev con Discourse Calendar (and Event) - 0.5 0162ed5

Descrizione:

Dopo aver unito gli argomenti ed eliminato un post unito, l’argomento di destinazione diventa inaccessibile a causa di un errore del server ([NoMethodError: undefined method 'category_id' for nil).

Ci si aspetta che l’argomento funzioni normalmente e non causi un errore del server.

Traccia completa
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'

Passaggi riproducibili:

Su 3.5.0.beta8-dev con Discourse Calendar (and Event) - 0.5 0162ed5 abilitato:

  1. Crea un nuovo argomento topic 1 - that will be deleted con un singolo post come user1 che è tl1
  2. Crea un nuovo argomento topic 2 - that will break con un singolo post assicurati che Calendar Event faccia parte di questo post.
  3. Come user1 elimina il tuo post in topic 1 - that will be deleted bloccando l’argomento e sostituendo il tuo post con “(topic deleted by author)”
  4. Come user2 che ha permessi di moderator:
  5. Seleziona i post in topic 1 - that will be deleted e seleziona il primo post (ora eliminato) > sposta su > topic 2 - that will break con l’opzione preserve chronological order after merging selezionata.
  6. Come user2 elimina il primo post appena unito in topic 2 - that will break (il post appena unito che dice “(topic deleted by author)”) questo farà sì che topic 2 - that will break si interrompa e generi l’errore sopra indicato.
    Una soluzione alternativa - disabilita il plugin #calendar-and-event. Questo ti permetterà di visitare l’argomento interrotto e ripristinare il primo post. Quindi riabilita il plugin.

Discussione:

Questo ha anche identificato un bug leggermente meno grave in Discourse in cui l’esecuzione di quanto sopra con il plugin #calendar-and-event disabilitato renderà l’argomento non elencato - vedi segnalazione di bug separata

2 Mi Piace

Grazie mille per la dettagliata spiegazione. Concordo che dovremmo sistemare questo, per ora metterò un pr-welcome su questo.

1 Mi Piace

Grazie a entrambi per il rapporto dettagliato e il follow-up. Mi sono appena imbattuto in un problema simile dopo aver unito argomenti con eventi del calendario e non riuscivo a capire perché l’argomento si interrompesse. Lieto di vedere che questo è documentato.

Terrò d’occhio eventuali PR per questo. Nel frattempo, disabilitare temporaneamente il plugin come soluzione è utile da sapere. Fatemi sapere se c’è qualcosa che posso aiutare a testare.

FWIW penso di poter semplificare la riproduzione:

  • Abilita sia Calendario abilitato che Evento post Discourse abilitato
  • Come amministratore, crea Argomento1
  • Come amministratore, crea Argomento2 e includi un evento post usando ‘Crea evento’ dal menu del compositore con il cerchio più
  • Come amministratore, vai all’Argomento1 e usa la chiave inglese dell’argomento per selezionare l’OP e unire nell’Argomento2 con preserva l'ordine cronologico dopo l'unione selezionato

A questo punto l’evento post non è più l’OP dell’argomento per Argomento2

  • Come amministratore, elimina Argomento2 usando l’eliminazione del post dell’OP o l’opzione di eliminazione dell’argomento

Risultato: rotto. Argomento eliminato inaccessibile. Errore in /logs di NoMethodError (undefined method ‘category_id’ for nil)


La correzione qui sarebbe impedire l’unione che sostituirebbe l’evento come OP?

Quando si tenta di unire un post evento (uno posizionato correttamente in un OP) in un altro argomento, viene bloccato con questo nei log:

Failed to process hijacked response correctly : ActiveRecord::RecordNotSaved : Un evento può essere solo nel primo post di un argomento

(L’errore dell’interfaccia utente è più generico, ‘Si è verificato un errore durante lo spostamento dei post.`, sarebbe bello se fosse più verboso)

Si potrebbe applicare qualcosa di simile per impedire un’unione che sposti l’evento dalla posizione di OP?

3 Mi Piace