После обновления до версии 2.8.0beta2 некоторые пользователи не могут открыть настройки (и др.)

На этой неделе я обновился с версии 2.7.0.beta2 до 2.8.0.beta2. С тех пор моя обычная учётная запись (но не учётная запись администратора) не может открыть ни одну из моих страниц /u/. Вместо этого появляется ошибка 404. Это происходит как на рабочем столе (Firefox 84 и 89), так и на мобильных устройствах (тестировалось на Android), а также после выхода из системы, очистки кэша и повторного входа.

Я подозреваю, что это изменение связано с проблемой:

У меня был установлен плагин discourse-user-card-badges (он отображается как версия 0.1) ещё до этого обновления, и это изменение вместе с ошибкой ниже заставляют меня думать, что, возможно, плагин несовместим с внесёнными изменениями? Если так, разве обновление не должно отключить плагин или попросить меня его отключить?

activemodel (6.1.3.2) lib/active_model/attribute_methods.rb:469:in `method_missing'
plugins/discourse-user-card-badges/plugin.rb:40:in `block (2 levels) in activate!'
(eval):93: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:343:in `as_json'
activesupport (6.1.3.2) lib/active_support/json/encoding.rb:22:in `encode'
activesupport (6.1.3.2) lib/active_support/json/encoding.rb:22:in `encode'
activesupport (6.1.3.2) lib/active_support/core_ext/object/json.rb:43: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/application_controller.rb:519:in `render_json_dump'
app/controllers/users_controller.rb:94:in `block (2 levels) in show'
actionpack (6.1.3.2) lib/action_controller/metal/mime_responds.rb:214:in `respond_to'
app/controllers/users_controller.rb:86:in `show'
actionpack (6.1.3.2) lib/action_controller/metal/basic_implicit_render.rb:6:in `send_action'
actionpack (6.1.3.2) lib/abstract_controller/base.rb:228:in `process_action'
actionpack (6.1.3.2) lib/action_controller/metal/rendering.rb:30:in `process_action'
actionpack (6.1.3.2) lib/abstract_controller/callbacks.rb:42:in `block in process_action'
activesupport (6.1.3.2) lib/active_support/callbacks.rb:117:in `block in run_callbacks'
app/controllers/application_controller.rb:395:in `block in with_resolved_locale'
i18n (1.8.10) lib/i18n.rb:314:in `with_locale'
app/controllers/application_controller.rb:395:in `with_resolved_locale'
activesupport (6.1.3.2) lib/active_support/callbacks.rb:126:in `block in run_callbacks'
activesupport (6.1.3.2) lib/active_support/callbacks.rb:137:in `run_callbacks'
actionpack (6.1.3.2) lib/abstract_controller/callbacks.rb:41:in `process_action'
actionpack (6.1.3.2) lib/action_controller/metal/rescue.rb:22:in `process_action'
actionpack (6.1.3.2) lib/action_controller/metal/instrumentation.rb:34:in `block in process_action'
activesupport (6.1.3.2) lib/active_support/notifications.rb:203:in `block in instrument'
activesupport (6.1.3.2) lib/active_support/notifications/instrumenter.rb:24:in `instrument'
activesupport (6.1.3.2) lib/active_support/notifications.rb:203:in `instrument'
actionpack (6.1.3.2) lib/action_controller/metal/instrumentation.rb:33:in `process_action'
actionpack (6.1.3.2) lib/action_controller/metal/params_wrapper.rb:249:in `process_action'
activerecord (6.1.3.2) lib/active_record/railties/controller_runtime.rb:27:in `process_action'
actionpack (6.1.3.2) lib/abstract_controller/base.rb:165:in `process'
actionview (6.1.3.2) lib/action_view/rendering.rb:39:in `process'
rack-mini-profiler (2.3.2) lib/mini_profiler/profiling_methods.rb:85:in `block in profile_method'


actionpack (6.1.3.2) lib/action_controller/metal.rb:190:in `dispatch'
actionpack (6.1.3.2) lib/action_controller/metal.rb:254:in `dispatch'
actionpack (6.1.3.2) lib/action_dispatch/routing/route_set.rb:50:in `dispatch'
actionpack (6.1.3.2) lib/action_dispatch/routing/route_set.rb:33:in `serve'
actionpack (6.1.3.2) lib/action_dispatch/journey/router.rb:50:in `block in serve'
actionpack (6.1.3.2) lib/action_dispatch/journey/router.rb:32:in `each'
actionpack (6.1.3.2) lib/action_dispatch/journey/router.rb:32:in `serve'
actionpack (6.1.3.2) lib/action_dispatch/routing/route_set.rb:842:in `call'
lib/middleware/omniauth_bypass_middleware.rb:71:in `call'
rack (2.2.3) lib/rack/tempfile_reaper.rb:15:in `call'
rack (2.2.3) lib/rack/conditional_get.rb:27:in `call'
rack (2.2.3) lib/rack/head.rb:12:in `call'
actionpack (6.1.3.2) lib/action_dispatch/http/permissions_policy.rb:22:in `call'
lib/content_security_policy/middleware.rb:12:in `call'
lib/middleware/anonymous_cache.rb:355:in `call'
rack (2.2.3) lib/rack/session/abstract/id.rb:266:in `context'
rack (2.2.3) lib/rack/session/abstract/id.rb:260:in `call'
actionpack (6.1.3.2) lib/action_dispatch/middleware/cookies.rb:689:in `call'
actionpack (6.1.3.2) lib/action_dispatch/middleware/callbacks.rb:27:in `block in call'
activesupport (6.1.3.2) lib/active_support/callbacks.rb:98:in `run_callbacks'
actionpack (6.1.3.2) lib/action_dispatch/middleware/callbacks.rb:26:in `call'
actionpack (6.1.3.2) lib/action_dispatch/middleware/actionable_exceptions.rb:18:in `call'
actionpack (6.1.3.2) lib/action_dispatch/middleware/debug_exceptions.rb:29:in `call'
actionpack (6.1.3.2) lib/action_dispatch/middleware/show_exceptions.rb:33:in `call'
logster (2.9.6) lib/logster/middleware/reporter.rb:43:in `call'
railties (6.1.3.2) lib/rails/rack/logger.rb:37:in `call_app'
railties (6.1.3.2) lib/rails/rack/logger.rb:28:in `call'
config/initializers/100-quiet_logger.rb:23:in `call'
config/initializers/100-silence_logger.rb:31:in `call'
actionpack (6.1.3.2) lib/action_dispatch/middleware/remote_ip.rb:81:in `call'
actionpack (6.1.3.2) lib/action_dispatch/middleware/request_id.rb:26:in `call'
lib/middleware/enforce_hostname.rb:23:in `call'
rack (2.2.3) lib/rack/method_override.rb:24:in `call'
actionpack (6.1.3.2) lib/action_dispatch/middleware/executor.rb:14:in `call'
rack (2.2.3) lib/rack/sendfile.rb:110:in `call'
actionpack (6.1.3.2) lib/action_dispatch/middleware/host_authorization.rb:92:in `call'
rack-mini-profiler (2.3.2) lib/mini_profiler/profiler.rb:249:in `call'


message_bus (3.3.6) lib/message_bus/rack/middleware.rb:61:in `call'
lib/middleware/request_tracker.rb:177:in `call'
railties (6.1.3.2) lib/rails/engine.rb:539:in `call'
railties (6.1.3.2) lib/rails/railtie.rb:207:in `public_send'
railties (6.1.3.2) lib/rails/railtie.rb:207:in `method_missing'
rack (2.2.3) lib/rack/urlmap.rb:74:in `block in call'
rack (2.2.3) lib/rack/urlmap.rb:58:in `each'
rack (2.2.3) lib/rack/urlmap.rb:58:in `call'
unicorn (6.0.0) lib/unicorn/http_server.rb:634:in `process_client'
unicorn (6.0.0) lib/unicorn/http_server.rb:732:in `worker_loop'
unicorn (6.0.0) lib/unicorn/http_server.rb:547:in `spawn_missing_workers'
unicorn (6.0.0) lib/unicorn/http_server.rb:143:in `start'
unicorn (6.0.0) bin/unicorn:128:in `<top (required)>'
vendor/bundle/ruby/2.7.0/bin/unicorn:23:in `load'
vendor/bundle/ruby/2.7.0/bin/unicorn:23:in `<main>'

Это сторонний плагин? Значит, у вас есть план действий по отключению плагина?

Судя по всему, этот плагин является официальным. При клике на него меня перенаправляет на:

Да, отключение плагина устраняет ошибку 404. Мой вопрос: почему это требует ручного вмешательства, учитывая, что я думал, что это официальный плагин и он должен продолжать работать.

Это та функциональность, которую мы перенесли из плагина в ядро?

В таком случае нам стоит добавить уведомление об устаревании в плагин… что ты думаешь, @neil?

Отмечу, что перед публикацией я проверил и увидел, что последний коммит в плагине был более свежим, чем релиз 2.8.0beta2. При повторном просмотре я заметил, что коммит сделан пользователем «бот», так что это может ни о чём не говорить.

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

Этот пост Why does eviltrout have a garbage man badge? показывает раннюю версию функции значков:

До этого обновления выбор ограничивался изображениями, связанными с полученными достижениями. Я прикрепил пользовательские изображения ко всем значкам на своём форуме, чтобы сделать такие значки в карточках пользователей более привлекательными. (Стандартные, э-э, «мусорные».)

Думаю, это новый столбец is_favorite, добавленный в таблицу UserBadges.

Скорее всего, SQL-запрос теперь не работает.

UserBadge.attribute_names.map do |name|
              if name == 'is_favorite'
                "BOOL_OR(user_badges.#{name}) AS is_favorite"
              else
                "MAX(user_badges.#{name}) AS #{name}"
              end
            end

Я только что объединил исправление для плагина:

Колонка image была удалена из Badge в UX: Add image uploader widget for uploading badge images (#12377) · discourse/discourse@a23d0f9 · GitHub, и мы частично обновили плагин, но упустили некоторые места.

Хотя мы стремимся не допускать, чтобы изменения в ядре ломали плагины, иногда мы либо упускаем места использования, либо наши плагины не имеют достаточного покрытия тестами (мы запускаем тесты для всех официальных плагинов каждый раз при внесении изменений в ядро). В приведённом выше коммите я добавил больше тестов в плагин discourse-user-card-badges, чтобы предотвратить подобные проблемы в будущем.

Я понимаю, что ошибки случаются. Когда я это написал, я думал, что функциональность этого плагина дублируется новой функцией ядра. Только после более глубокого изучения этой функции я понял, что это разные вещи.