Describe the bug
The GraphQL API is causing the following exception being thrown breaking the comments component when code reloading happens:
Exception: RuntimeError (Duplicate type definition found for name 'CommentableInterface' at 'Interface on Comment' (CommentableInterface, CommentableInterface))
This issue only exists in development environment where the Decidim classes are being reloaded after code changes happen on the application level.
To Reproduce
Steps to reproduce the behavior:
- Clone the master branch
- Create the dummy development app (and seed it)
- Start the dummy development app server
- Load any component that has commenting enabled
- See that the comments are loaded properly
- Open any file in the
app folder of the dummy development app (e.g. app/controllers/application_controller.rb)
- Make a change to that file (e.g. add new line) and save it
- Reload the page you had open in the browser with the comments visible
- See that the comments are no longer loaded properly
- See the exception and stack trace appear in the development console
Expected behavior
I would expect the comments to be correctly loaded and continue to work during development.
Screenshots

Stacktrace
Exception: RuntimeError (Duplicate type definition found... [click for more]
RuntimeError (Duplicate type definition found for name 'CommentableInterface' at 'Interface on Comment' (CommentableInterface, CommentableInterface)):
graphql (1.8.8) lib/graphql/schema/traversal.rb:168:in `visit'
graphql (1.8.8) lib/graphql/schema/traversal.rb:142:in `block in visit'
graphql (1.8.8) lib/graphql/schema/traversal.rb:142:in `each'
graphql (1.8.8) lib/graphql/schema/traversal.rb:142:in `visit'
graphql (1.8.8) lib/graphql/schema/traversal.rb:205:in `visit_field_on_type'
graphql (1.8.8) lib/graphql/schema/traversal.rb:185:in `block in visit_fields'
graphql (1.8.8) lib/graphql/schema/traversal.rb:184:in `each'
graphql (1.8.8) lib/graphql/schema/traversal.rb:184:in `visit_fields'
graphql (1.8.8) lib/graphql/schema/traversal.rb:145:in `visit'
graphql (1.8.8) lib/graphql/schema/traversal.rb:142:in `block in visit'
graphql (1.8.8) lib/graphql/schema/traversal.rb:142:in `each'
graphql (1.8.8) lib/graphql/schema/traversal.rb:142:in `visit'
graphql (1.8.8) lib/graphql/schema/traversal.rb:205:in `visit_field_on_type'
graphql (1.8.8) lib/graphql/schema/traversal.rb:185:in `block in visit_fields'
graphql (1.8.8) lib/graphql/schema/traversal.rb:184:in `each'
graphql (1.8.8) lib/graphql/schema/traversal.rb:184:in `visit_fields'
graphql (1.8.8) lib/graphql/schema/traversal.rb:143:in `visit'
graphql (1.8.8) lib/graphql/schema/traversal.rb:205:in `visit_field_on_type'
graphql (1.8.8) lib/graphql/schema/traversal.rb:185:in `block in visit_fields'
graphql (1.8.8) lib/graphql/schema/traversal.rb:184:in `each'
graphql (1.8.8) lib/graphql/schema/traversal.rb:184:in `visit_fields'
graphql (1.8.8) lib/graphql/schema/traversal.rb:143:in `visit'
graphql (1.8.8) lib/graphql/schema/traversal.rb:205:in `visit_field_on_type'
graphql (1.8.8) lib/graphql/schema/traversal.rb:185:in `block in visit_fields'
graphql (1.8.8) lib/graphql/schema/traversal.rb:184:in `each'
graphql (1.8.8) lib/graphql/schema/traversal.rb:184:in `visit_fields'
graphql (1.8.8) lib/graphql/schema/traversal.rb:143:in `visit'
graphql (1.8.8) lib/graphql/schema/traversal.rb:124:in `block in visit'
graphql (1.8.8) lib/graphql/schema/traversal.rb:124:in `each'
graphql (1.8.8) lib/graphql/schema/traversal.rb:124:in `visit'
graphql (1.8.8) lib/graphql/schema/traversal.rb:43:in `initialize'
graphql (1.8.8) lib/graphql/schema.rb:1037:in `new'
graphql (1.8.8) lib/graphql/schema.rb:1037:in `rebuild_artifacts'
graphql (1.8.8) lib/graphql/schema.rb:272:in `types'
graphql (1.8.8) lib/graphql/schema/validation.rb:134:in `block in <module:Rules>'
graphql (1.8.8) lib/graphql/schema/validation.rb:19:in `block in validate'
graphql (1.8.8) lib/graphql/schema/validation.rb:19:in `each'
graphql (1.8.8) lib/graphql/schema/validation.rb:19:in `reduce'
graphql (1.8.8) lib/graphql/schema/validation.rb:19:in `validate'
graphql (1.8.8) lib/graphql/schema.rb:233:in `define'
graphql (1.8.8) lib/graphql/define/instance_definable.rb:228:in `define'
/path/to/decidim/decidim-api/app/types/decidim/api/schema.rb:6:in `<module:Api>'
/path/to/decidim/decidim-api/app/types/decidim/api/schema.rb:4:in `<module:Decidim>'
/path/to/decidim/decidim-api/app/types/decidim/api/schema.rb:3:in `<main>'
bootsnap (1.3.0) lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:100:in `load'
bootsnap (1.3.0) lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:100:in `load'
activesupport (5.2.1) lib/active_support/dependencies.rb:472:in `block in load_file'
activesupport (5.2.1) lib/active_support/dependencies.rb:657:in `new_constants_in'
activesupport (5.2.1) lib/active_support/dependencies.rb:471:in `load_file'
activesupport (5.2.1) lib/active_support/dependencies.rb:369:in `block in require_or_load'
activesupport (5.2.1) lib/active_support/dependencies.rb:37:in `block in load_interlock'
activesupport (5.2.1) lib/active_support/dependencies/interlock.rb:14:in `block in loading'
activesupport (5.2.1) lib/active_support/concurrency/share_lock.rb:151:in `exclusive'
activesupport (5.2.1) lib/active_support/dependencies/interlock.rb:13:in `loading'
activesupport (5.2.1) lib/active_support/dependencies.rb:37:in `load_interlock'
activesupport (5.2.1) lib/active_support/dependencies.rb:352:in `require_or_load'
activesupport (5.2.1) lib/active_support/dependencies.rb:506:in `load_missing_constant'
bootsnap (1.3.0) lib/bootsnap/load_path_cache/core_ext/active_support.rb:43:in `load_missing_constant'
activesupport (5.2.1) lib/active_support/dependencies.rb:193:in `const_missing'
activesupport (5.2.1) lib/active_support/dependencies.rb:538:in `load_missing_constant'
bootsnap (1.3.0) lib/bootsnap/load_path_cache/core_ext/active_support.rb:43:in `load_missing_constant'
activesupport (5.2.1) lib/active_support/dependencies.rb:193:in `const_missing'
/path/to/decidim/decidim-api/app/controllers/decidim/api/queries_controller.rb:11:in `create'
actionpack (5.2.1) lib/action_controller/metal/basic_implicit_render.rb:6:in `send_action'
actionpack (5.2.1) lib/abstract_controller/base.rb:194:in `process_action'
actionpack (5.2.1) lib/action_controller/metal/rendering.rb:30:in `process_action'
actionpack (5.2.1) lib/abstract_controller/callbacks.rb:42:in `block in process_action'
activesupport (5.2.1) lib/active_support/callbacks.rb:132:in `run_callbacks'
actionpack (5.2.1) lib/abstract_controller/callbacks.rb:41:in `process_action'
actionpack (5.2.1) lib/action_controller/metal/rescue.rb:22:in `process_action'
actionpack (5.2.1) lib/action_controller/metal/instrumentation.rb:34:in `block in process_action'
activesupport (5.2.1) lib/active_support/notifications.rb:168:in `block in instrument'
activesupport (5.2.1) lib/active_support/notifications/instrumenter.rb:23:in `instrument'
activesupport (5.2.1) lib/active_support/notifications.rb:168:in `instrument'
actionpack (5.2.1) lib/action_controller/metal/instrumentation.rb:32:in `process_action'
actionpack (5.2.1) lib/action_controller/metal/params_wrapper.rb:256:in `process_action'
activerecord (5.2.1) lib/active_record/railties/controller_runtime.rb:24:in `process_action'
actionpack (5.2.1) lib/abstract_controller/base.rb:134:in `process'
actionview (5.2.1) lib/action_view/rendering.rb:32:in `process'
actionpack (5.2.1) lib/action_controller/metal.rb:191:in `dispatch'
actionpack (5.2.1) lib/action_controller/metal.rb:252:in `dispatch'
actionpack (5.2.1) lib/action_dispatch/routing/route_set.rb:52:in `dispatch'
actionpack (5.2.1) lib/action_dispatch/routing/route_set.rb:34:in `serve'
actionpack (5.2.1) lib/action_dispatch/journey/router.rb:52:in `block in serve'
actionpack (5.2.1) lib/action_dispatch/journey/router.rb:35:in `each'
actionpack (5.2.1) lib/action_dispatch/journey/router.rb:35:in `serve'
actionpack (5.2.1) lib/action_dispatch/routing/route_set.rb:840:in `call'
railties (5.2.1) lib/rails/engine.rb:524:in `call'
railties (5.2.1) lib/rails/railtie.rb:190:in `public_send'
railties (5.2.1) lib/rails/railtie.rb:190:in `method_missing'
actionpack (5.2.1) lib/action_dispatch/routing/mapper.rb:19:in `block in <class:Constraints>'
actionpack (5.2.1) lib/action_dispatch/routing/mapper.rb:48:in `serve'
actionpack (5.2.1) lib/action_dispatch/journey/router.rb:52:in `block in serve'
actionpack (5.2.1) lib/action_dispatch/journey/router.rb:35:in `each'
actionpack (5.2.1) lib/action_dispatch/journey/router.rb:35:in `serve'
actionpack (5.2.1) lib/action_dispatch/routing/route_set.rb:840:in `call'
railties (5.2.1) lib/rails/engine.rb:524:in `call'
railties (5.2.1) lib/rails/railtie.rb:190:in `public_send'
railties (5.2.1) lib/rails/railtie.rb:190:in `method_missing'
actionpack (5.2.1) lib/action_dispatch/routing/mapper.rb:19:in `block in <class:Constraints>'
actionpack (5.2.1) lib/action_dispatch/routing/mapper.rb:48:in `serve'
actionpack (5.2.1) lib/action_dispatch/journey/router.rb:52:in `block in serve'
actionpack (5.2.1) lib/action_dispatch/journey/router.rb:35:in `each'
actionpack (5.2.1) lib/action_dispatch/journey/router.rb:35:in `serve'
actionpack (5.2.1) lib/action_dispatch/routing/route_set.rb:840:in `call'
/path/to/decidim/decidim-core/app/middleware/decidim/current_organization.rb:21:in `call'
omniauth (1.8.1) lib/omniauth/strategy.rb:190:in `call!'
omniauth (1.8.1) lib/omniauth/strategy.rb:168:in `call'
warden (1.2.7) lib/warden/manager.rb:36:in `block in call'
warden (1.2.7) lib/warden/manager.rb:35:in `catch'
warden (1.2.7) lib/warden/manager.rb:35:in `call'
rack (2.0.5) lib/rack/tempfile_reaper.rb:15:in `call'
rack (2.0.5) lib/rack/etag.rb:25:in `call'
rack (2.0.5) lib/rack/conditional_get.rb:38:in `call'
rack (2.0.5) lib/rack/head.rb:12:in `call'
actionpack (5.2.1) lib/action_dispatch/http/content_security_policy.rb:18:in `call'
rack (2.0.5) lib/rack/session/abstract/id.rb:232:in `context'
rack (2.0.5) lib/rack/session/abstract/id.rb:226:in `call'
actionpack (5.2.1) lib/action_dispatch/middleware/cookies.rb:670:in `call'
activerecord (5.2.1) lib/active_record/migration.rb:559:in `call'
actionpack (5.2.1) lib/action_dispatch/middleware/callbacks.rb:28:in `block in call'
activesupport (5.2.1) lib/active_support/callbacks.rb:98:in `run_callbacks'
actionpack (5.2.1) lib/action_dispatch/middleware/callbacks.rb:26:in `call'
actionpack (5.2.1) lib/action_dispatch/middleware/executor.rb:14:in `call'
actionpack (5.2.1) lib/action_dispatch/middleware/debug_exceptions.rb:61:in `call'
web-console (3.6.2) lib/web_console/middleware.rb:135:in `call_app'
web-console (3.6.2) lib/web_console/middleware.rb:30:in `block in call'
web-console (3.6.2) lib/web_console/middleware.rb:20:in `catch'
web-console (3.6.2) lib/web_console/middleware.rb:20:in `call'
actionpack (5.2.1) lib/action_dispatch/middleware/show_exceptions.rb:33:in `call'
railties (5.2.1) lib/rails/rack/logger.rb:38:in `call_app'
railties (5.2.1) lib/rails/rack/logger.rb:26:in `block in call'
activesupport (5.2.1) lib/active_support/tagged_logging.rb:71:in `block in tagged'
activesupport (5.2.1) lib/active_support/tagged_logging.rb:28:in `tagged'
activesupport (5.2.1) lib/active_support/tagged_logging.rb:71:in `tagged'
railties (5.2.1) lib/rails/rack/logger.rb:26:in `call'
sprockets-rails (3.2.1) lib/sprockets/rails/quiet_assets.rb:13:in `call'
actionpack (5.2.1) lib/action_dispatch/middleware/remote_ip.rb:81:in `call'
request_store (1.4.1) lib/request_store/middleware.rb:19:in `call'
actionpack (5.2.1) lib/action_dispatch/middleware/request_id.rb:27:in `call'
rack (2.0.5) lib/rack/method_override.rb:22:in `call'
rack (2.0.5) lib/rack/runtime.rb:22:in `call'
activesupport (5.2.1) lib/active_support/cache/strategy/local_cache_middleware.rb:29:in `call'
actionpack (5.2.1) lib/action_dispatch/middleware/executor.rb:14:in `call'
actionpack (5.2.1) lib/action_dispatch/middleware/static.rb:127:in `call'
rack (2.0.5) lib/rack/sendfile.rb:111:in `call'
rack-cors (1.0.2) lib/rack/cors.rb:97:in `call'
railties (5.2.1) lib/rails/engine.rb:524:in `call'
puma (3.11.4) lib/puma/configuration.rb:225:in `call'
puma (3.11.4) lib/puma/server.rb:632:in `handle_request'
puma (3.11.4) lib/puma/server.rb:446:in `process_client'
puma (3.11.4) lib/puma/server.rb:306:in `block in run'
puma (3.11.4) lib/puma/thread_pool.rb:120:in `block in spawn_thread'
graphql (1.8.8) lib/graphql/schema/traversal.rb:168:in `visit'
graphql (1.8.8) lib/graphql/schema/traversal.rb:142:in `block in visit'
graphql (1.8.8) lib/graphql/schema/traversal.rb:142:in `each'
graphql (1.8.8) lib/graphql/schema/traversal.rb:142:in `visit'
graphql (1.8.8) lib/graphql/schema/traversal.rb:205:in `visit_field_on_type'
graphql (1.8.8) lib/graphql/schema/traversal.rb:185:in `block in visit_fields'
graphql (1.8.8) lib/graphql/schema/traversal.rb:184:in `each'
graphql (1.8.8) lib/graphql/schema/traversal.rb:184:in `visit_fields'
graphql (1.8.8) lib/graphql/schema/traversal.rb:145:in `visit'
graphql (1.8.8) lib/graphql/schema/traversal.rb:142:in `block in visit'
graphql (1.8.8) lib/graphql/schema/traversal.rb:142:in `each'
graphql (1.8.8) lib/graphql/schema/traversal.rb:142:in `visit'
graphql (1.8.8) lib/graphql/schema/traversal.rb:205:in `visit_field_on_type'
graphql (1.8.8) lib/graphql/schema/traversal.rb:185:in `block in visit_fields'
graphql (1.8.8) lib/graphql/schema/traversal.rb:184:in `each'
graphql (1.8.8) lib/graphql/schema/traversal.rb:184:in `visit_fields'
graphql (1.8.8) lib/graphql/schema/traversal.rb:143:in `visit'
graphql (1.8.8) lib/graphql/schema/traversal.rb:205:in `visit_field_on_type'
graphql (1.8.8) lib/graphql/schema/traversal.rb:185:in `block in visit_fields'
graphql (1.8.8) lib/graphql/schema/traversal.rb:184:in `each'
graphql (1.8.8) lib/graphql/schema/traversal.rb:184:in `visit_fields'
graphql (1.8.8) lib/graphql/schema/traversal.rb:143:in `visit'
graphql (1.8.8) lib/graphql/schema/traversal.rb:205:in `visit_field_on_type'
graphql (1.8.8) lib/graphql/schema/traversal.rb:185:in `block in visit_fields'
graphql (1.8.8) lib/graphql/schema/traversal.rb:184:in `each'
graphql (1.8.8) lib/graphql/schema/traversal.rb:184:in `visit_fields'
graphql (1.8.8) lib/graphql/schema/traversal.rb:143:in `visit'
graphql (1.8.8) lib/graphql/schema/traversal.rb:124:in `block in visit'
graphql (1.8.8) lib/graphql/schema/traversal.rb:124:in `each'
graphql (1.8.8) lib/graphql/schema/traversal.rb:124:in `visit'
graphql (1.8.8) lib/graphql/schema/traversal.rb:43:in `initialize'
graphql (1.8.8) lib/graphql/schema.rb:1037:in `new'
graphql (1.8.8) lib/graphql/schema.rb:1037:in `rebuild_artifacts'
graphql (1.8.8) lib/graphql/schema.rb:272:in `types'
graphql (1.8.8) lib/graphql/schema/validation.rb:134:in `block in <module:Rules>'
graphql (1.8.8) lib/graphql/schema/validation.rb:19:in `block in validate'
graphql (1.8.8) lib/graphql/schema/validation.rb:19:in `each'
graphql (1.8.8) lib/graphql/schema/validation.rb:19:in `reduce'
graphql (1.8.8) lib/graphql/schema/validation.rb:19:in `validate'
graphql (1.8.8) lib/graphql/schema.rb:233:in `define'
graphql (1.8.8) lib/graphql/define/instance_definable.rb:228:in `define'
/path/to/decidim/decidim-api/app/types/decidim/api/schema.rb:6:in `<module:Api>'
/path/to/decidim/decidim-api/app/types/decidim/api/schema.rb:4:in `<module:Decidim>'
/path/to/decidim/decidim-api/app/types/decidim/api/schema.rb:3:in `<main>'
bootsnap (1.3.0) lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:100:in `load'
bootsnap (1.3.0) lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:100:in `load'
activesupport (5.2.1) lib/active_support/dependencies.rb:472:in `block in load_file'
activesupport (5.2.1) lib/active_support/dependencies.rb:657:in `new_constants_in'
activesupport (5.2.1) lib/active_support/dependencies.rb:471:in `load_file'
activesupport (5.2.1) lib/active_support/dependencies.rb:369:in `block in require_or_load'
activesupport (5.2.1) lib/active_support/dependencies.rb:37:in `block in load_interlock'
activesupport (5.2.1) lib/active_support/dependencies/interlock.rb:14:in `block in loading'
activesupport (5.2.1) lib/active_support/concurrency/share_lock.rb:151:in `exclusive'
activesupport (5.2.1) lib/active_support/dependencies/interlock.rb:13:in `loading'
activesupport (5.2.1) lib/active_support/dependencies.rb:37:in `load_interlock'
activesupport (5.2.1) lib/active_support/dependencies.rb:352:in `require_or_load'
activesupport (5.2.1) lib/active_support/dependencies.rb:506:in `load_missing_constant'
bootsnap (1.3.0) lib/bootsnap/load_path_cache/core_ext/active_support.rb:43:in `load_missing_constant'
activesupport (5.2.1) lib/active_support/dependencies.rb:193:in `const_missing'
activesupport (5.2.1) lib/active_support/dependencies.rb:538:in `load_missing_constant'
bootsnap (1.3.0) lib/bootsnap/load_path_cache/core_ext/active_support.rb:43:in `load_missing_constant'
activesupport (5.2.1) lib/active_support/dependencies.rb:193:in `const_missing'
/path/to/decidim/decidim-api/app/controllers/decidim/api/queries_controller.rb:11:in `create'
actionpack (5.2.1) lib/action_controller/metal/basic_implicit_render.rb:6:in `send_action'
actionpack (5.2.1) lib/abstract_controller/base.rb:194:in `process_action'
actionpack (5.2.1) lib/action_controller/metal/rendering.rb:30:in `process_action'
actionpack (5.2.1) lib/abstract_controller/callbacks.rb:42:in `block in process_action'
activesupport (5.2.1) lib/active_support/callbacks.rb:132:in `run_callbacks'
actionpack (5.2.1) lib/abstract_controller/callbacks.rb:41:in `process_action'
actionpack (5.2.1) lib/action_controller/metal/rescue.rb:22:in `process_action'
actionpack (5.2.1) lib/action_controller/metal/instrumentation.rb:34:in `block in process_action'
activesupport (5.2.1) lib/active_support/notifications.rb:168:in `block in instrument'
activesupport (5.2.1) lib/active_support/notifications/instrumenter.rb:23:in `instrument'
activesupport (5.2.1) lib/active_support/notifications.rb:168:in `instrument'
actionpack (5.2.1) lib/action_controller/metal/instrumentation.rb:32:in `process_action'
actionpack (5.2.1) lib/action_controller/metal/params_wrapper.rb:256:in `process_action'
activerecord (5.2.1) lib/active_record/railties/controller_runtime.rb:24:in `process_action'
actionpack (5.2.1) lib/abstract_controller/base.rb:134:in `process'
actionview (5.2.1) lib/action_view/rendering.rb:32:in `process'
actionpack (5.2.1) lib/action_controller/metal.rb:191:in `dispatch'
actionpack (5.2.1) lib/action_controller/metal.rb:252:in `dispatch'
actionpack (5.2.1) lib/action_dispatch/routing/route_set.rb:52:in `dispatch'
actionpack (5.2.1) lib/action_dispatch/routing/route_set.rb:34:in `serve'
actionpack (5.2.1) lib/action_dispatch/journey/router.rb:52:in `block in serve'
actionpack (5.2.1) lib/action_dispatch/journey/router.rb:35:in `each'
actionpack (5.2.1) lib/action_dispatch/journey/router.rb:35:in `serve'
actionpack (5.2.1) lib/action_dispatch/routing/route_set.rb:840:in `call'
railties (5.2.1) lib/rails/engine.rb:524:in `call'
railties (5.2.1) lib/rails/railtie.rb:190:in `public_send'
railties (5.2.1) lib/rails/railtie.rb:190:in `method_missing'
actionpack (5.2.1) lib/action_dispatch/routing/mapper.rb:19:in `block in <class:Constraints>'
actionpack (5.2.1) lib/action_dispatch/routing/mapper.rb:48:in `serve'
actionpack (5.2.1) lib/action_dispatch/journey/router.rb:52:in `block in serve'
actionpack (5.2.1) lib/action_dispatch/journey/router.rb:35:in `each'
actionpack (5.2.1) lib/action_dispatch/journey/router.rb:35:in `serve'
actionpack (5.2.1) lib/action_dispatch/routing/route_set.rb:840:in `call'
railties (5.2.1) lib/rails/engine.rb:524:in `call'
railties (5.2.1) lib/rails/railtie.rb:190:in `public_send'
railties (5.2.1) lib/rails/railtie.rb:190:in `method_missing'
actionpack (5.2.1) lib/action_dispatch/routing/mapper.rb:19:in `block in <class:Constraints>'
actionpack (5.2.1) lib/action_dispatch/routing/mapper.rb:48:in `serve'
actionpack (5.2.1) lib/action_dispatch/journey/router.rb:52:in `block in serve'
actionpack (5.2.1) lib/action_dispatch/journey/router.rb:35:in `each'
actionpack (5.2.1) lib/action_dispatch/journey/router.rb:35:in `serve'
actionpack (5.2.1) lib/action_dispatch/routing/route_set.rb:840:in `call'
/path/to/decidim/decidim-core/app/middleware/decidim/current_organization.rb:21:in `call'
omniauth (1.8.1) lib/omniauth/strategy.rb:190:in `call!'
omniauth (1.8.1) lib/omniauth/strategy.rb:168:in `call'
warden (1.2.7) lib/warden/manager.rb:36:in `block in call'
warden (1.2.7) lib/warden/manager.rb:35:in `catch'
warden (1.2.7) lib/warden/manager.rb:35:in `call'
rack (2.0.5) lib/rack/tempfile_reaper.rb:15:in `call'
rack (2.0.5) lib/rack/etag.rb:25:in `call'
rack (2.0.5) lib/rack/conditional_get.rb:38:in `call'
rack (2.0.5) lib/rack/head.rb:12:in `call'
actionpack (5.2.1) lib/action_dispatch/http/content_security_policy.rb:18:in `call'
rack (2.0.5) lib/rack/session/abstract/id.rb:232:in `context'
rack (2.0.5) lib/rack/session/abstract/id.rb:226:in `call'
actionpack (5.2.1) lib/action_dispatch/middleware/cookies.rb:670:in `call'
activerecord (5.2.1) lib/active_record/migration.rb:559:in `call'
actionpack (5.2.1) lib/action_dispatch/middleware/callbacks.rb:28:in `block in call'
activesupport (5.2.1) lib/active_support/callbacks.rb:98:in `run_callbacks'
actionpack (5.2.1) lib/action_dispatch/middleware/callbacks.rb:26:in `call'
actionpack (5.2.1) lib/action_dispatch/middleware/executor.rb:14:in `call'
actionpack (5.2.1) lib/action_dispatch/middleware/debug_exceptions.rb:61:in `call'
web-console (3.6.2) lib/web_console/middleware.rb:135:in `call_app'
web-console (3.6.2) lib/web_console/middleware.rb:30:in `block in call'
web-console (3.6.2) lib/web_console/middleware.rb:20:in `catch'
web-console (3.6.2) lib/web_console/middleware.rb:20:in `call'
actionpack (5.2.1) lib/action_dispatch/middleware/show_exceptions.rb:33:in `call'
railties (5.2.1) lib/rails/rack/logger.rb:38:in `call_app'
railties (5.2.1) lib/rails/rack/logger.rb:26:in `block in call'
activesupport (5.2.1) lib/active_support/tagged_logging.rb:71:in `block in tagged'
activesupport (5.2.1) lib/active_support/tagged_logging.rb:28:in `tagged'
activesupport (5.2.1) lib/active_support/tagged_logging.rb:71:in `tagged'
railties (5.2.1) lib/rails/rack/logger.rb:26:in `call'
sprockets-rails (3.2.1) lib/sprockets/rails/quiet_assets.rb:13:in `call'
actionpack (5.2.1) lib/action_dispatch/middleware/remote_ip.rb:81:in `call'
request_store (1.4.1) lib/request_store/middleware.rb:19:in `call'
actionpack (5.2.1) lib/action_dispatch/middleware/request_id.rb:27:in `call'
rack (2.0.5) lib/rack/method_override.rb:22:in `call'
rack (2.0.5) lib/rack/runtime.rb:22:in `call'
activesupport (5.2.1) lib/active_support/cache/strategy/local_cache_middleware.rb:29:in `call'
actionpack (5.2.1) lib/action_dispatch/middleware/executor.rb:14:in `call'
actionpack (5.2.1) lib/action_dispatch/middleware/static.rb:127:in `call'
rack (2.0.5) lib/rack/sendfile.rb:111:in `call'
rack-cors (1.0.2) lib/rack/cors.rb:97:in `call'
railties (5.2.1) lib/rails/engine.rb:524:in `call'
puma (3.11.4) lib/puma/configuration.rb:225:in `call'
puma (3.11.4) lib/puma/server.rb:632:in `handle_request'
puma (3.11.4) lib/puma/server.rb:446:in `process_client'
puma (3.11.4) lib/puma/server.rb:306:in `block in run'
puma (3.11.4) lib/puma/thread_pool.rb:120:in `block in spawn_thread'
Extra data (please complete the following information):
- Device: Any
- Device OS: Ubuntu 18.04 (server backend)
- Browser: Any
- Decidim Version: current master branch
- Decidim installation: any (during development)
Additional context
Related issues that I found regarding similar issues:
This is caused by Rails' constant reloading which removes the GraphQL schema definitions defined by the constants in Decidim, e.g. Decidim::Comments::CommentableType. However, the definitions are still stored internally in the graphql gem which causes this issue when Decidim is trying to redefine them.
The source of the problem can be found from the graphql gem on this line as shown in the stacktrace:
https://github.com/rmosolgo/graphql-ruby/blob/d63a0b2b56c28bd06c3d789bfd1311cedb6b5e07/lib/graphql/schema/traversal.rb#L168
Possible solution for this would be to move the GraphQL schema definitions out of the app folders in the Decidim gems.
Describe the bug
The GraphQL API is causing the following exception being thrown breaking the comments component when code reloading happens:
This issue only exists in development environment where the Decidim classes are being reloaded after code changes happen on the application level.
To Reproduce
Steps to reproduce the behavior:
appfolder of the dummy development app (e.g.app/controllers/application_controller.rb)Expected behavior
I would expect the comments to be correctly loaded and continue to work during development.
Screenshots

Stacktrace
Exception: RuntimeError (Duplicate type definition found... [click for more]
Extra data (please complete the following information):
Additional context
Related issues that I found regarding similar issues:
This is caused by Rails' constant reloading which removes the GraphQL schema definitions defined by the constants in Decidim, e.g.
Decidim::Comments::CommentableType. However, the definitions are still stored internally in thegraphqlgem which causes this issue when Decidim is trying to redefine them.The source of the problem can be found from the
graphqlgem on this line as shown in the stacktrace:https://github.com/rmosolgo/graphql-ruby/blob/d63a0b2b56c28bd06c3d789bfd1311cedb6b5e07/lib/graphql/schema/traversal.rb#L168
Possible solution for this would be to move the GraphQL schema definitions out of the
appfolders in the Decidim gems.