Desde la actualización 2.8.0beta2 algunos usuarios no pueden acceder a las preferencias (etc)

A principios de esta semana actualicé de la versión 2.7.0.beta2 a la 2.8.0.beta2. Desde entonces, mi cuenta regular (pero no mi cuenta de administrador) no puede acceder a ninguna de mis páginas /u/. En su lugar, obtengo un error 404. Esto ocurre tanto en escritorio (Firefox 84 y 89) como en móvil (probado en Android), y también después de cerrar sesión, borrar la caché y volver a entrar.

Sospecho que este cambio está relacionado con el siguiente problema:

He tenido instalado el plugin discourse-user-card-badges (que muestra la versión 0.1) desde mucho antes de esta actualización. Ese cambio junto con el error que aparece a continuación me hacen pensar que quizás el plugin no es compatible con los cambios. Si es así, ¿no debería la actualización desactivar el plugin o pedirme que lo desactive?

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

¿Es este un plugin de terceros? ¿Entonces tienes un camino a seguir para desactivar el plugin?

El plugin parece ser oficial. Al hacer clic en él, me lleva a:

Y sí, desactivar el plugin soluciona el error 404. Mi pregunta es por qué esto requiere un paso manual, dado que pensé que se trataba de un plugin oficial y que seguiría funcionando.

¿Es esta una funcionalidad que pasamos del complemento al núcleo?

En ese caso, deberíamos añadir un aviso de obsolescencia en el complemento… ¿qué opinas, @neil?

Voy a señalar que, antes de publicar, verifiqué y vi que el último commit en el plugin era más reciente que la versión 2.8.0beta2. Al volver a revisarlo, noto que el commit proviene de un usuario “bot”, por lo que podría no ser indicativo de mucho.

Al examinarlo más de cerca, no creo que sea exactamente lo mismo. La insignia aparecía como una imagen grande en la esquina inferior izquierda de la tarjeta de usuario. Esta nueva funcionalidad del núcleo parece controlar cajas pequeñas con imágenes diminutas de insignias y el nombre de la insignia a lo largo de la parte inferior de la tarjeta de usuario.

Esta publicación Why does eviltrout have a garbage man badge? muestra una versión temprana de la función de insignias:

Tal como existía antes de esta actualización, la selección se limitaba a imágenes asociadas con logros obtenidos. He adjuntado imágenes personalizadas a todas las insignias en mi foro para hacer que estas insignias en la tarjeta de usuario sean más atractivas. (Las predeterminadas son, um, “basura”.)

Supongo que es la nueva columna is_favorite añadida a la tabla UserBadges.

Es probable que la consulta SQL esté rota ahora.

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

Acabo de fusionar una corrección para el plugin:

La columna image se eliminó de Badge en UX: Add image uploader widget for uploading badge images (#12377) · discourse/discourse@a23d0f9 · GitHub, y aunque actualizamos parcialmente el plugin en ese momento, dejamos algunos lugares sin ajustar.

Aunque nos esforzamos por evitar que los cambios en el núcleo rompan los plugins, a veces pasamos por alto algunos usos o nuestros plugins carecen de cobertura de pruebas (ejecutamos pruebas para todos los plugins oficiales cada vez que se realiza un cambio en el núcleo). En el commit mencionado, agregué más pruebas al plugin discourse-user-card-badges para evitar problemas similares en el futuro.

Entiendo que ocurren errores. Cuando escribí eso, pensé que la funcionalidad de este complemento estaba duplicada por una nueva característica del núcleo. Solo después de explorar esa característica más a fondo me di cuenta de que son cosas diferentes.