Посты с встроенными опросами не загружаются

После обновления до версии v2.4.0beta8 посты с встроенными опросами перестали загружаться, выдавая следующую трассировку стека:

/discourse/vendor/bundle/ruby/2.6.0/gems/activemodel-6.0.1/lib/active_model/attribute_methods.rb:431:in `method_missing'
/discourse/vendor/bundle/ruby/2.6.0/gems/active_model_serializers-0.8.4/lib/active_model/serializer.rb:99:in `block in attribute'
(eval):15:in `_fast_attributes'
/discourse/vendor/bundle/ruby/2.6.0/gems/active_model_serializers-0.8.4/lib/active_model/serializer.rb:468:in `rescue in attributes'
/discourse/vendor/bundle/ruby/2.6.0/gems/active_model_serializers-0.8.4/lib/active_model/serializer.rb:455:in `attributes'
/discourse/vendor/bundle/ruby/2.6.0/gems/active_model_serializers-0.8.4/lib/active_model/serializer.rb:480:in `_serializable_hash'
/discourse/vendor/bundle/ruby/2.6.0/gems/active_model_serializers-0.8.4/lib/active_model/serializer.rb:359:in `serializable_hash'
/discourse/vendor/bundle/ruby/2.6.0/gems/active_model_serializers-0.8.4/lib/active_model/serializer.rb:347:in `as_json'
/discourse/vendor/bundle/ruby/2.6.0/gems/activesupport-6.0.1/lib/active_support/json/encoding.rb:22:in `encode'
/discourse/vendor/bundle/ruby/2.6.0/gems/activesupport-6.0.1/lib/active_support/json/encoding.rb:22:in `encode'
/discourse/vendor/bundle/ruby/2.6.0/gems/activesupport-6.0.1/lib/active_support/core_ext/object/json.rb:42:in `to_json'
/discourse/vendor/bundle/ruby/2.6.0/gems/active_model_serializers-0.8.4/lib/active_model/serializer.rb:331:in `to_json'
/discourse/vendor/bundle/ruby/2.6.0/gems/multi_json-1.13.1/lib/multi_json/adapters/oj.rb:40:in `dump'
/discourse/vendor/bundle/ruby/2.6.0/gems/multi_json-1.13.1/lib/multi_json/adapters/oj.rb:40:in `dump'
/discourse/vendor/bundle/ruby/2.6.0/gems/multi_json-1.13.1/lib/multi_json/adapter.rb:25:in `dump'
/discourse/vendor/bundle/ruby/2.6.0/gems/multi_json-1.13.1/lib/multi_json.rb:139:in `dump'
/discourse/app/controllers/topics_controller.rb:1003:in `block (2 levels) in perform_show_response'
/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/action_controller/metal/mime_responds.rb:214:in `respond_to'
/discourse/app/controllers/topics_controller.rb:1000:in `perform_show_response'
/discourse/app/controllers/topics_controller.rb:164:in `show'
/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/action_controller/metal/basic_implicit_render.rb:6:in `send_action'
/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/abstract_controller/base.rb:196:in `process_action'
/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/action_controller/metal/rendering.rb:30:in `process_action'
/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/abstract_controller/callbacks.rb:42:in `block in process_action'
/discourse/vendor/bundle/ruby/2.6.0/gems/activesupport-6.0.1/lib/active_support/callbacks.rb:135:in `run_callbacks'
/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/abstract_controller/callbacks.rb:41:in `process_action'
/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/action_controller/metal/rescue.rb:22:in `process_action'
/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/action_controller/metal/instrumentation.rb:33:in `block in process_action'
/discourse/vendor/bundle/ruby/2.6.0/gems/activesupport-6.0.1/lib/active_support/notifications.rb:180:in `block in instrument'
/discourse/vendor/bundle/ruby/2.6.0/gems/activesupport-6.0.1/lib/active_support/notifications/instrumenter.rb:24:in `instrument'
/discourse/vendor/bundle/ruby/2.6.0/gems/activesupport-6.0.1/lib/active_support/notifications.rb:180:in `instrument'
/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/action_controller/metal/instrumentation.rb:32:in `process_action'
/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/action_controller/metal/params_wrapper.rb:245:in `process_action'
/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.1/lib/active_record/railties/controller_runtime.rb:27:in `process_action'
/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/abstract_controller/base.rb:136:in `process'
/discourse/vendor/bundle/ruby/2.6.0/gems/actionview-6.0.1/lib/action_view/rendering.rb:39:in `process'
/discourse/vendor/bundle/ruby/2.6.0/gems/rack-mini-profiler-1.1.3/lib/mini_profiler/profiling_methods.rb:104:in `block in profile_method'
/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/action_controller/metal.rb:191:in `dispatch'
/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/action_controller/metal.rb:252:in `dispatch'
/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/action_dispatch/routing/route_set.rb:51:in `dispatch'
/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/action_dispatch/routing/route_set.rb:33:in `serve'
/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/action_dispatch/journey/router.rb:49:in `block in serve'
/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/action_dispatch/journey/router.rb:32:in `each'
/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/action_dispatch/journey/router.rb:32:in `serve'
/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/action_dispatch/routing/route_set.rb:837:in `call'
/discourse/vendor/bundle/ruby/2.6.0/gems/rack-protection-2.0.7/lib/rack/protection/frame_options.rb:31:in `call'
/discourse/lib/middleware/omniauth_bypass_middleware.rb:68:in `call'
/discourse/vendor/bundle/ruby/2.6.0/gems/rack-2.0.7/lib/rack/tempfile_reaper.rb:15:in `call'
/discourse/vendor/bundle/ruby/2.6.0/gems/rack-2.0.7/lib/rack/conditional_get.rb:25:in `call'
/discourse/vendor/bundle/ruby/2.6.0/gems/rack-2.0.7/lib/rack/head.rb:12:in `call'
/discourse/lib/content_security_policy/middleware.rb:12:in `call'
/discourse/lib/middleware/anonymous_cache.rb:274:in `call'
/discourse/config/initializers/008-rack-cors.rb:25:in `call'
/discourse/vendor/bundle/ruby/2.6.0/gems/rack-2.0.7/lib/rack/session/abstract/id.rb:232:in `context'
/discourse/vendor/bundle/ruby/2.6.0/gems/rack-2.0.7/lib/rack/session/abstract/id.rb:226:in `call'
/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/action_dispatch/middleware/cookies.rb:648:in `call'
/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/action_dispatch/middleware/callbacks.rb:27:in `block in call'
/discourse/vendor/bundle/ruby/2.6.0/gems/activesupport-6.0.1/lib/active_support/callbacks.rb:101:in `run_callbacks'
/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/action_dispatch/middleware/callbacks.rb:26:in `call'
/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/action_dispatch/middleware/actionable_exceptions.rb:17:in `call'
/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/action_dispatch/middleware/debug_exceptions.rb:32:in `call'
/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/action_dispatch/middleware/show_exceptions.rb:33:in `call'
/discourse/vendor/bundle/ruby/2.6.0/gems/logster-2.4.1/lib/logster/middleware/reporter.rb:43:in `call'
/discourse/vendor/bundle/ruby/2.6.0/gems/railties-6.0.1/lib/rails/rack/logger.rb:38:in `call_app'
/discourse/vendor/bundle/ruby/2.6.0/gems/railties-6.0.1/lib/rails/rack/logger.rb:28:in `call'
/discourse/config/initializers/100-quiet_logger.rb:18:in `call'
/discourse/config/initializers/100-silence_logger.rb:31:in `call'
/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/action_dispatch/middleware/remote_ip.rb:81:in `call'
/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/action_dispatch/middleware/request_id.rb:27:in `call'
/discourse/lib/middleware/enforce_hostname.rb:17:in `call'
/discourse/vendor/bundle/ruby/2.6.0/gems/rack-2.0.7/lib/rack/method_override.rb:22:in `call'
/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/action_dispatch/middleware/executor.rb:14:in `call'
/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/action_dispatch/middleware/static.rb:126:in `call'
/discourse/vendor/bundle/ruby/2.6.0/gems/rack-2.0.7/lib/rack/sendfile.rb:111:in `call'
/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/action_dispatch/middleware/host_authorization.rb:77:in `call'
/discourse/vendor/bundle/ruby/2.6.0/gems/rack-mini-profiler-1.1.3/lib/mini_profiler/profiler.rb:296:in `call'
/discourse/vendor/bundle/ruby/2.6.0/gems/message_bus-2.2.3/lib/message_bus/rack/middleware.rb:57:in `call'
/discourse/lib/middleware/request_tracker.rb:176:in `call'
/discourse/vendor/bundle/ruby/2.6.0/gems/railties-6.0.1/lib/rails/engine.rb:526:in `call'
/discourse/vendor/bundle/ruby/2.6.0/gems/railties-6.0.1/lib/rails/railtie.rb:190:in `public_send'
/discourse/vendor/bundle/ruby/2.6.0/gems/railties-6.0.1/lib/rails/railtie.rb:190:in `method_missing'
/discourse/vendor/bundle/ruby/2.6.0/gems/rack-2.0.7/lib/rack/urlmap.rb:68:in `block in call'
/discourse/vendor/bundle/ruby/2.6.0/gems/rack-2.0.7/lib/rack/urlmap.rb:53:in `each'
/discourse/vendor/bundle/ruby/2.6.0/gems/rack-2.0.7/lib/rack/urlmap.rb:53:in `call'
/discourse/vendor/bundle/ruby/2.6.0/gems/puma-3.12.1/lib/puma/configuration.rb:227:in `call'
/discourse/vendor/bundle/ruby/2.6.0/gems/puma-3.12.1/lib/puma/server.rb:660:in `handle_request'
/discourse/vendor/bundle/ruby/2.6.0/gems/puma-3.12.1/lib/puma/server.rb:474:in `process_client'
/discourse/vendor/bundle/ruby/2.6.0/gems/puma-3.12.1/lib/puma/server.rb:334:in `block in run'
/discourse/vendor/bundle/ruby/2.6.0/gems/puma-3.12.1/lib/puma/thread_pool.rb:135:in `block in spawn_thread'

Попробовать создать пост с опросом также не удалось. Мы не устанавливаем никаких плагинов, которые не поддерживаются официально, то же самое относится и к gem-пакетам, как указано в [1].

Не упустили ли мы что-то очевидное?

[1] Sign in · GitLab

Похоже, что следующая миграция никогда не выполнялась:

20191114160613_add_graph_to_polls.rb

и, следовательно, таблица polls выглядит следующим образом:

                                        Table "public.polls"
      Column      |            Type             |                     Modifiers                      
------------------+-----------------------------+----------------------------------------------------
 id               | bigint                      | not null default nextval('polls_id_seq'::regclass)
 post_id          | bigint                      | 
 name             | character varying           | not null default 'poll'::character varying
 close_at         | timestamp without time zone | 
 type             | integer                     | not null default 0
 status           | integer                     | not null default 0
 results          | integer                     | not null default 0
 visibility       | integer                     | not null default 0
 min              | integer                     | 
 max              | integer                     | 
 step             | integer                     | 
 anonymous_voters | integer                     | 
 created_at       | timestamp without time zone | not null
 updated_at       | timestamp without time zone | not null
Indexes:
    "polls_pkey" PRIMARY KEY, btree (id)
    "index_polls_on_post_id_and_name" UNIQUE, btree (post_id, name)
    "index_polls_on_post_id" btree (post_id)
Foreign-key constraints:
    "fk_rails_b50b782d08" FOREIGN KEY (post_id) REFERENCES posts(id)
Referenced by:
    TABLE "poll_votes" CONSTRAINT "fk_rails_a6e6974b7e" FOREIGN KEY (poll_id) REFERENCES polls(id)
    TABLE "poll_options" CONSTRAINT "fk_rails_aa85becb42" FOREIGN KEY (poll_id) REFERENCES polls(id)

Миграции выполняются при каждом запуске контейнера через init-контейнеры. Следующий вопрос — понять, почему именно эта миграция никогда не была запланирована.

Миграция выполнена, проблема исправлена, но возникла новая:

SecurityError: Операция небезопасна. Url: https://discourse.gnome.org/assets/application-6cbf6fb051e218dafa1bf601dae045b532b3ec5125762bb09aac8ffaf3f25958.js Line: 1 Column: 0 

SecurityError: Операция небезопасна.
Url: https://discourse.gnome.org/assets/application-6cbf6fb051e218dafa1bf601dae045b532b3ec5125762bb09aac8ffaf3f25958.js
Line: 1
Column: 0
Window Location: https://discourse.gnome.org//t/is-it-time-to-turn-shell-extension-version-locking-back-on/809

replaceState@https://discourse.gnome.org/assets/application-6cbf6fb051e218dafa1bf601dae045b532b3ec5125762bb09aac8ffaf3f25958.js:1:392500
initState@https://discourse.gnome.org/assets/application-6cbf6fb051e218dafa1bf601dae045b532b3ec5125762bb09aac8ffaf3f25958.js:1:391813
init@https://discourse.gnome.org/assets/application-6cbf6fb051e218dafa1bf601dae045b532b3ec5125762bb09aac8ffaf3f25958.js:1:391567
e@https://discourse.gnome.org/assets/ember_jquery-c2cca4a19fd4c70eabc95b010a6d7643955ec2a2251aeb1d70f625773eebea21.js:1:290766
h@https://discourse.gnome.org/assets/ember_jquery-c2cca4a19fd4c70eabc95b010a6d7643955ec2a2251aeb1d70f625773eebea21.js:1:281717
f</e.create@https://discourse.gnome.org/assets/ember_jquery-c2cca4a19fd4c70eabc95b010a6d7643955ec2a2251aeb1d70f625773eebea21.js:1:283033
v</t.create@https://discourse.gnome.org/assets/ember_jquery-c2cca4a19fd4c70eabc95b010a6d7643955ec2a2251aeb1d70f625773eebea21.js:1:94398
h/<@https://discourse.gnome.org/assets/ember_jquery-c2cca4a19fd4c70eabc95b010a6d7643955ec2a2251aeb1d70f625773eebea21.js:1:92267
h@https://discourse.gnome.org/assets/ember_jquery-c2cca4a19fd4c70eabc95b010a6d7643955ec2a2251aeb1d70f625773eebea21.js:1:92643
n</t.lookup@https://discourse.gnome.org/assets/ember_jquery-c2cca4a19fd4c70eabc95b010a6d7643955ec2a2251aeb1d70f625773eebea21.js:1:91157
lookup@https://discourse.gnome.org/assets/ember_jquery-c2cca4a19fd4c70eabc95b010a6d7643955ec2a2251aeb1d70f625773eebea21.js:1:272294
_</n._setupLocation@https://discourse.gnome.org/assets/ember_jquery-c2cca4a19fd4c70eabc95b010a6d7643955ec2a2251aeb1d70f625773eebea21.js:1:243579
_</n.setupRouter@https://discourse.gnome.org/assets/ember_jquery-c2cca4a19fd4c70eabc95b010a6d7643955ec2a2251aeb1d70f625773eebea21.js:1:240697
_</n.startRouting@https://discourse.gnome.org/assets/ember_jquery-c2cca4a19fd4c70eabc95b010a6d7643955ec2a2251aeb1d70f625773eebea21.js:1:240535
startRouting@https://discourse.gnome.org/assets/ember_jquery-c2cca4a19fd4c70eabc95b010a6d7643955ec2a2251aeb1d70f625773eebea21.js:1:319395
didBecomeReady@https://discourse.gnome.org/assets/ember_jquery-c2cca4a19fd4c70eabc95b010a6d7643955ec2a2251aeb1d70f625773eebea21.js:1:324708
f</t.invoke@https://discourse.gnome.org/assets/ember_jquery-c2cca4a19fd4c70eabc95b010a6d7643955ec2a2251aeb1d70f625773eebea21.js:1:482548
f</t.flush@https://discourse.gnome.org/assets/ember_jquery-c2cca4a19fd4c70eabc95b010a6d7643955ec2a2251aeb1d70f625773eebea21.js:1:481548
p</t.flush@https://discourse.gnome.org/assets/ember_jquery-c2cca4a19fd4c70eabc95b010a6d7643955ec2a2251aeb1d70f625773eebea21.js:1:483563
t</t._end@https://discourse.gnome.org/assets/ember_jquery-c2cca4a19fd4c70eabc95b010a6d7643955ec2a2251aeb1d70f625773eebea21.js:1:488992
t</t.end@https://discourse.gnome.org/assets/ember_jquery-c2cca4a19fd4c70eabc95b010a6d7643955ec2a2251aeb1d70f625773eebea21.js:1:485528
t</t._run@https://discourse.gnome.org/assets/ember_jquery-c2cca4a19fd4c70eabc95b010a6d7643955ec2a2251aeb1d70f625773eebea21.js:1:489530
t</t._join@https://discourse.gnome.org/assets/ember_jquery-c2cca4a19fd4c70eabc95b010a6d7643955ec2a2251aeb1d70f625773eebea21.js:1:489315
t</t.join@https://discourse.gnome.org/assets/ember_jquery-c2cca4a19fd4c70eabc95b010a6d7643955ec2a2251aeb1d70f625773eebea21.js:1:486236
p@https://discourse.gnome.org/assets/ember_jquery-c2cca4a19fd4c70eabc95b010a6d7643955ec2a2251aeb1d70f625773eebea21.js:1:352709
e.bind/<@https://discourse.gnome.org/assets/ember_jquery-c2cca4a19fd4c70eabc95b010a6d7643955ec2a2251aeb1d70f625773eebea21.js:1:352933
e@https://discourse.gnome.org/assets/ember_jquery-c2cca4a19fd4c70eabc95b010a6d7643955ec2a2251aeb1d70f625773eebea21.js:1:29470
l/</t<@https://discourse.gnome.org/assets/ember_jquery-c2cca4a19fd4c70eabc95b010a6d7643955ec2a2251aeb1d70f625773eebea21.js:1:29794

Вам известно, что это кастомная установка, которая отбрасывает всю работу, проделанную нами в нашем кастомном Docker-образе, чтобы гарантировать, что такие ошибки, как отсутствующие миграции, никогда не возникают?

Полагаю, в вашем кастомном решении не хватает миграций плагинов при запуске. Миграции в плагинах встречаются редко, и именно поэтому проблема не проявилась раньше.

Спасибо за ваш отзыв. Почти всё в нашей инфраструктуре настроено для работы поверх таких инструментов, как OpenShift, и я понимаю, что, возможно, что-то упустил. Нам предстоит изучить возможность использования в будущем Docker-образа от upstream-разработчиков и, что самое важное, придерживаться стабильных релизов (сейчас мы используем версию tests-passed). У вас есть какие-либо соображения по поводу другого вопроса, который я упомянул? Буду благодарен за ваши комментарии и по этому поводу. Спасибо!

Это ошибка JavaScript, которая может быть вызвана пользователями с неправильно настроенными браузерами, расширениями и т. д.

В данном конкретном случае URL полностью некорректен:

https://discourse.gnome.org//t/is-it-time-to-turn-shell-extension-version-locking-back-on/809

Обратите внимание на двойную // — это либо опечатка пользователя, либо неправильно настроенный обратный прокси-сервер.

Ах, действительно, только что увидел плохую правку — исправил, и мы снова в строю! Большое спасибо за помощь, Рафаэль, я очень ценю это, особенно учитывая, что наша установка сильно кастомизирована. Хорошего дня!

Это очень важно, так как обе проблемы, с которыми вы столкнулись сегодня, были вызваны вашими собственными действиями. В случае установки с официальной поддержкой они были бы невозможны.

Нравится проект Gnome, продолжайте в том же духе!

Для тех, кто интересуется, вторая ошибка также возникает здесь, на meta — в качестве примера посетите https://meta.discourse.org//t/posts-with-embedded-polls-fail-to-load/135549 :slight_smile:

Кажется, что спецификация базового парсера URL гласит, что браузер всегда выбросит ошибку валидации, если путь начинается с двух слэшей.

Предположительно, можно утверждать, что Discourse должен проверять валидность пути, который он передаёт в history.replaceState(), перед выполнением этой операции, и исправлять его, но это звучит как огромная головная боль (то есть: реализация собственного парсера URL и автоматического исправителя) для чего-то, что в реальной жизни встречается довольно редко.

Этот пост был создан благодаря расплавленным мозгам от чтения живых стандартов WHATWG HTML

Так как эта тема была автоматически поднята сегодня, я решил попробовать. Протестировал этот URL в последнем браузере Chrome на Ubuntu:
https://meta.discourse.org//t/posts-with-embedded-polls-fail-to-load/135549/9

Теперь URL перенаправляется, исправляя двойную //, и страница загружается без проблем: https://meta.discourse.org//t/posts-with-embedded-polls-fail-to-load/135549/9