El error de página Oops de Git Hang y las cuentas de usuario Admin/Mod

ActionView::Template::Error (no implicit conversion of Array into String)

Reproduje el error de la página Oops al iniciar sesión, que parece afectar solo a administradores y, en algunos casos, a otras cuentas de personal. En este caso, se trata de una cuenta de administrador, pero solo de aquellas cuentas de administrador que estaban presentes antes de “git hang”, simplemente al intentar iniciar sesión de nuevo.

Luego revisé los registros, ya que ahora estoy más familiarizado con cómo funciona la función de salida de /logs, ¡que es excelente!

Este error aparece como un “error fatal” y comenzó el día 22. Parece muy similar al problema de “git hang”, pero en este caso sigue sin resolverse a pesar de varias reconstrucciones hasta el momento, lo que significa que algunas cuentas de administrador están esencialmente bloqueadas. Por favor, vea la información y los registros de backtrace a continuación:

Información

Message

ActionView::Template::Error (no implicit conversion of Array into String)
app/serializers/current_user_serializer.rb:216:in 'CurrentUserSerializer#has_new_upcoming_changes'
lib/application_layout_preloader.rb:81:in 'ApplicationLayoutPreloader#preload_current_user_data'
lib/application_layout_preloader.rb:32:in 'ApplicationLayoutPreloader#preloaded_data'
app/helpers/application_helper.rb:987:in 'ApplicationHelper#preloaded_json'
app/views/layouts/application.html.erb:111
lib/topic_list_responder.rb:16:in 'block (2 levels) in TopicListResponder#respond_with_list'
lib/topic_list_responder.rb:7:in 'TopicListResponder#respond_with_list'
app/controllers/list_controller.rb:119:in 'block (2 levels) in class:ListController'
app/controllers/application_controller.rb:458:in 'block in ApplicationController#with_resolved_locale'
app/controllers/application_controller.rb:458:in 'ApplicationController#with_resolved_locale'
app/controllers/application_controller.rb:1140:in 'ApplicationController#ensure_dont_cache_page'
lib/middleware/omniauth_bypass_middleware.rb:35:in 'Middleware::OmniauthBypassMiddleware#call'
lib/middleware/crawler_hooks.rb:13:in 'Middleware::CrawlerHooks#call'
lib/content_security_policy/middleware.rb:12:in 'ContentSecurityPolicy::Middleware#call'
lib/middleware/anonymous_cache.rb:431:in 'Middleware::AnonymousCache#call'
lib/middleware/csp_script_nonce_injector.rb:13:in 'Middleware::CspScriptNonceInjector#call'
lib/middleware/track_view_session_id_injector.rb:12:in 'Middleware::TrackViewSessionIdInjector#call'
config/initializers/008-rack-cors.rb:14:in 'Discourse::Cors#call'
lib/middleware/default_headers.rb:13:in 'Middleware::DefaultHeaders#call'
config/initializers/100-quiet_logger.rb:20:in 'DiscourseRackQuietAssetsLogger#call'
config/initializers/100-silence_logger.rb:29:in 'SilenceLogger#call'
lib/middleware/enforce_hostname.rb:23:in 'Middleware::EnforceHostname#call'
lib/middleware/request_tracker.rb:384:in 'Middleware::RequestTracker#call'
lib/middlewar...

Backtrace:


Backtrace

activesupport (8.1.4) lib/active_support/values/time_zone.rb:461:in 'Date._parse'
activesupport (8.1.4) lib/active_support/values/time_zone.rb:461:in 'ActiveSupport::TimeZone#parse'
app/serializers/current_user_serializer.rb:216:in 'CurrentUserSerializer#has_new_upcoming_changes'
(eval at active_model_serializers-0.8.4/lib/active_model/serializer.rb:467):81:in 'CurrentUserSerializer#_fast_attributes'
active_model_serializers (0.8.4) lib/active_model/serializer.rb:456:in 'ActiveModel::Serializer#attributes'
active_model_serializers (0.8.4) lib/active_model/serializer.rb:480:in 'ActiveModel::Serializer#_serializable_hash'
active_model_serializers (0.8.4) lib/active_model/serializer.rb:359:in 'ActiveModel::Serializer#serializable_hash'
active_model_serializers (0.8.4) lib/active_model/serializer.rb:347:in 'ActiveModel::Serializer#as_json'
activesupport (8.1.4) lib/active_support/json/encoding.rb:53:in 'Oj::Rails::Encoder#encode'
activesupport (8.1.4) lib/active_support/json/encoding.rb:53:in 'ActiveSupport::JSON.encode'
activesupport (8.1.4) lib/active_support/core_ext/object/json.rb:42:in 'ActiveSupport::ToJsonWithActiveSupportEncoder#to_json'
active_model_serializers (0.8.4) lib/active_model/serializer.rb:331:in 'ActiveModel::Serializer#to_json'
multi_json (1.21.1) lib/multi_json/adapters/oj.rb:67:in 'Oj.dump'
multi_json (1.21.1) lib/multi_json/adapters/oj.rb:67:in 'MultiJSON::Adapters::Oj#dump'
multi_json (1.21.1) lib/multi_json/adapter.rb:110:in 'MultiJSON::Adapter.dump'
multi_json (1.21.1) lib/multi_json.rb:215:in 'MultiJSON.generate'
multi_json (1.21.1) lib/multi_json/deprecated.rb:34:in 'Kernel#public_send'
multi_json (1.21.1) lib/multi_json/deprecated.rb:34:in 'block in MultiJSON.deprecate_alias'
multi_json (1.21.1) lib/multi_json.rb:298:in 'Kernel#public_send'
multi_json (1.21.1) lib/multi_json.rb:298:in 'block (2 levels) in module:MultiJson'
lib/application_layout_preloader.rb:81:in 'ApplicationLayoutPreloader#preload_current_user_data'
lib/application_layout_preloader.rb:32:in 'ApplicationLayoutPreloader#preloaded_data'
app/helpers/application_helper.rb:987:in 'ApplicationHelper#preloaded_json'
app/views/layouts/application.html.erb:111
actionview (8.1.4) lib/action_view/base.rb:281:in 'Kernel#public_send'
actionview (8.1.4) lib/action_view/base.rb:281:in 'ActionView::Base#_run'
actionview (8.1.4) lib/action_view/template.rb:284:in 'block in ActionView::Template#render'
activesupport (8.1.4) lib/active_support/notifications.rb:212:in 'ActiveSupport::Notifications.instrument'
actionview (8.1.4) lib/action_view/template.rb:590:in 'ActionView::Template#instrument_render_template'
actionview (8.1.4) lib/action_view/template.rb:272:in 'ActionView::Template#render'
rack-mini-profiler (5.0.0) lib/mini_profiler/profiling_methods.rb:90:in 'block in ActionView::Template#profile_method'
actionview (8.1.4) lib/action_view/renderer/template_renderer.rb:77:in 'block in ActionView::TemplateRenderer#render_with_layout'
activesupport (8.1.4) lib/active_support/notifications.rb:210:in 'block in ActiveSupport::Notifications.instrument'
activesupport (8.1.4) lib/active_support/notifications/instrumenter.rb:58:in 'ActiveSupport::Notifications::Instrumenter#instrument'
activesupport (8.1.4) lib/active_support/notifications.rb:210:in 'ActiveSupport::Notifications.instrument'
actionview (8.1.4) lib/action_view/renderer/template_renderer.rb:75:in 'ActionView::TemplateRenderer#render_with_layout'
actionview (8.1.4) lib/action_view/renderer/template_renderer.rb:59:in 'ActionView::TemplateRenderer#render_template'
actionview (8.1.4) lib/action_view/renderer/template_renderer.rb:11:in 'ActionView::TemplateRenderer#render'
actionview (8.1.4) lib/action_view/renderer/renderer.rb:58:in 'ActionView::Renderer#render_template_to_object'
actionview (8.1.4) lib/action_view/renderer/renderer.rb:31:in 'ActionView::Renderer#render_to_object'
actionview (8.1.4) lib/action_view/rendering.rb:136:in 'block in ActionView::Rendering#_render_template'
actionview (8.1.4) lib/action_view/base.rb:308:in 'ActionView::Base#in_rendering_context'
actionview (8.1.4) lib/action_view/rendering.rb:135:in 'ActionView::Rendering#_render_template'
actionpack (8.1.4) lib/action_controller/metal/streaming.rb:179:in 'ActionController::Streaming#_render_template'
actionview (8.1.4) lib/action_view/rendering.rb:122:in 'ActionView::Rendering#render_to_body'
actionpack (8.1.4) lib/action_controller/metal/rendering.rb:192:in 'ActionController::Rendering#render_to_body'
actionpack (8.1.4) lib/action_controller/metal/renderers.rb:155:in 'ActionController::Renderers#render_to_body'
actionpack (8.1.4) lib/abstract_controller/rendering.rb:28:in 'AbstractController::Rendering#render'
actionpack (8.1.4) lib/action_controller/metal/rendering.rb:173:in 'ActionController::Rendering#render'
actionpack (8.1.4) lib/action_controller/metal/instrumentation.rb:31:in 'block (2 levels) in ActionController::Instrumentation#render'
activesupport (8.1.4) lib/active_support/benchmark.rb:17:in 'ActiveSupport::Benchmark.realtime'
actionpack (8.1.4) lib/action_controller/metal/instrumentation.rb:31:in 'block in ActionController::Instrumentation#render'
actionpack (8.1.4) lib/action_controller/metal/instrumentation.rb:100:in 'ActionController::Instrumentation#cleanup_view_runtime'
activerecord (8.1.4) lib/active_record/railties/controller_runtime.rb:48:in 'ActiveRecord::Railties::ControllerRuntime#cleanup_view_runtime'
actionpack (8.1.4) lib/action_controller/metal/instrumentation.rb:30:in 'ActionController::Instrumentation#render'
lib/topic_list_responder.rb:16:in 'block (2 levels) in TopicListResponder#respond_with_list'
actionpack (8.1.4) lib/action_controller/metal/mime_responds.rb:224:in 'ActionController::MimeResponds#respond_to'
lib/topic_list_responder.rb:7:in 'TopicListResponder#respond_with_list'
app/controllers/list_controller.rb:119:in 'block (2 levels) in class:ListController'
actionpack (8.1.4) lib/action_controller/metal/basic_implicit_render.rb:8:in 'ActionController::BasicImplicitRender#send_action'
actionpack (8.1.4) lib/abstract_controller/base.rb:221:in 'AbstractController::Base#process_action'
actionpack (8.1.4) lib/action_controller/metal/rendering.rb:199:in 'ActionController::Rendering#process_action'
actionpack (8.1.4) lib/abstract_controller/callbacks.rb:267:in 'block in AbstractController::Callbacks#process_action'
activesupport (8.1.4) lib/active_support/callbacks.rb:121:in 'block in ActiveSupport::Callbacks#run_callbacks'
app/controllers/application_controller.rb:458:in 'block in ApplicationController#with_resolved_locale'
i18n (1.14.8) lib/i18n.rb:354:in 'I18n::Base#with_locale'
app/controllers/application_controller.rb:458:in 'ApplicationController#with_resolved_locale'
activesupport (8.1.4) lib/active_support/callbacks.rb:130:in 'block in ActiveSupport::Callbacks#run_callbacks'
app/controllers/application_controller.rb:1140:in 'ApplicationController#ensure_dont_cache_page'
activesupport (8.1.4) lib/active_support/callbacks.rb:130:in 'block in ActiveSupport::Callbacks#run_callbacks'
activesupport (8.1.4) lib/active_support/callbacks.rb:141:in 'ActiveSupport::Callbacks#run_callbacks'
actionpack (8.1.4) lib/abstract_controller/callbacks.rb:266:in 'AbstractController::Callbacks#process_action'
actionpack (8.1.4) lib/action_controller/metal/rescue.rb:36:in 'ActionController::Rescue#process_action'
actionpack (8.1.4) lib/action_controller/metal/instrumentation.rb:76:in 'block in ActionController::Instrumentation#process_action'
activesupport (8.1.4) lib/active_support/notifications.rb:210:in 'block in ActiveSupport::Notifications.instrument'
activesupport (8.1.4) lib/ac

Para cualquiera en una situación similar, la solución alternativa funcional que permitió el acceso de administrador a la instancia de Discourse fue crear una nueva cuenta de usuario administrador usando el comando rake create:admin después de ingresar a la aplicación mediante ./launcher enter app.

Sin embargo, esto no resuelve definitivamente el problema principal, ya que las cuentas de administrador existentes aún se encuentran con la página de error Oops y no pueden iniciar sesión de forma normal.

Espero que haya una solución para este problema en algún momento y agradezco de antemano cualquier orientación o consejo.


Posibles temas relacionados:

En un intento de encontrar una solución a contratiempo utilizando las funciones estándar de Discourse, me pregunté si la función de “fusionar” cuentas de usuario podría funcionar. Por ejemplo, crear una nueva cuenta de administrador y luego fusionarla con la cuenta de administrador anterior (para el personal, esto debe hacerse a través de la consola).

La otra idea era revocar y luego volver a conceder el estado de administrador, pero no sé si la revocación podría causar problemas.

Esto es más bien un pensamiento improvisado por mi parte, y no he intentado ninguna de las opciones anteriores, pero sí experimenté con publicar un tema y luego cambiar la propiedad a la cuenta de usuario administrador que estaba bloqueada por el error, y entonces esta notificación de Discourse post-notice new-user apareció con lo siguiente:

:tada: Esta es la primera vez que [nombre de usuario] publica — ¡démosle la bienvenida al sitio!

Ay, es como si la cuenta de administrador no hubiera existido hasta este punto (cambio de propiedad) de la publicación.

¿Podría esto ser indicativo de algo? :thinking:

No estaba prestando atención, ya que solo eran “advertencias”, pero se produce un error de MaxMindDB al mismo tiempo, aunque antes del ActiveVIEW::Tempalte::Error mencionado anteriormente.

MaxMindDB (/var/www/discourse/vendor/data/GeoLite2-City.mmdb) could not be found: No such file or directory @ rb_sysopen - /var/www/discourse/vendor/data/GeoLite2-City.mmdb
MaxMindDB (/var/www/discourse/vendor/data/GeoLite2-ASN.mmdb) could not be found: No such file or directory @ rb_sysopen - /var/www/discourse/vendor/data/GeoLite2-ASN.mmdb

En la pestaña ENV, noté

Jobs::SuspiciousLogin

¿Quizás este error no fatal de MaxMindDB, que es una advertencia, está bloqueando el inicio de sesión de la cuenta de usuario de administrador y sirviendo la página de error “Oops” por alguna razón o como parte del error aquí?

¿Se trata de un problema de configuración manual de maxmind mal configurado?

El acceso a los archivos de Maxmind está bloqueado en algunas regiones. En particular, he observado esto en China.

Gracias, bueno, este servidor de Discourse no está en China, ni lo está la ubicación del usuario administrador que intenta iniciar sesión, y no creo que MaxMindDB se haya configurado nunca, o si se hizo parcialmente, nunca se terminó de configurar.

Recuerdo vagamente los ajustes de MaxMindDB en la administración, pero ahora no encuentro nada.

También acabo de darme cuenta de algo: hay que estar registrado como administrador para ver /logs, por lo que el usuario administrador en cuestión puede ver los registros y, desde allí, puede navegar a /admin usando el enlace «volver al sitio», pero se topa con los orbes UFO parpadeantes (5 círculos azules), así que al menos ha superado la página de error, aunque de manera bastante rebuscada, pero sigue sin estar dentro. :thinking:

Puedo ver en los registros que esta actividad rebuscada está generando más del error del OP.

ActionView::Template::Error (no implicit conversion of Array into String)

la llamada se realiza desde el servidor, la ubicación de la conexión de entrada es irrelevante: vale la pena comprobarlo

Vale, pero el servidor no está en China.

eso era solo un ejemplo.

Oh, sí, claro.. ¡ya! :grin: Solo que no estoy seguro de qué debería estar comprobando en este caso.

@merefield @Ed_S @Falco La única instancia de este error que puedo encontrar y que se parece a este es aquí Error "no implicit conversion of Array into String" when using Gemini AI analysis on posts with images ¿quizás debería haber publicado este tema en la sección Contribute > Bug?

Parece tener algo que ver con la presentación de los próximos cambios; eso es algo que solo verían los administradores. Según ask.discourse.com

Toda la funcionalidad está controlada por una configuración de sitio oculta llamada enable_upcoming_changes, establecida en false en una consola de Rails:

SiteSetting.enable_upcoming_changes = false

Sin embargo, esto requiere acceso a la terminal/servidor, por lo que solo es posible en instalaciones autoalojadas.

Gracias, ejecuté ese comando en la consola de Rails, pero me dijo “comando no encontrado” :thinking:

ok, perdón, resulta que el LLM me dio información desactualizada.

estos son algunos comandos que he probado y utilizado.

para tabular los usuarios administrativos y el valor de su configuración para los cambios próximos:

# docker exec -it app rails r 'User.where(admin: true).each { |u| puts "#{u.id} #{u.username} #{u.user_option.enable_upcoming_change_available_notifications}" }'
-1 system true
-2 discobot true
1 AdminTeam false

para un id dado - en mi caso 1 - cambiar la configuración de ese id:

# docker exec -it app rails r 'x=1;User.find(x).user_option.update!(enable_upcoming_change_available_notifications: !User.find(x).user_option.enable_upcoming_change_available_notifications)'

Prefiero el comando de una línea desde la shell de root, aunque, por supuesto, uno podría entrar en docker y luego en rails para realizar las acciones si lo prefiere.

Siempre me pierdo un poco, así que con root shell te refieres a entrar mediante ./launcher enter app y rails c, ¿verdad?

Vale, la salida:

-1 system true

No hay administradores antiguos ni nuevos, ni discobot, ni ninguna otra persona registrada.

Quizás ese sea el problema: es posible que necesite aplicarse o activarse para el usuario administrador en cuestión. Si es así, ¿cómo se encuentra su id?

Vale, ejecuté el comando de nuevo y encontré el id, que es 1, así que es la misma configuración.

Sin embargo, cuando introduzco lo siguiente y lo ejecuto, muestra => true

x=1;User.find(x).user_option.update!(enable_upcoming_change_available_notifications: !User.find(x).user_option.enable_upcoming_change_available_notifications)

Queremos que sea false, ¿verdad?, así que no veo qué debería cambiarse en ese comando. Leí la acción como “find” y nada más; esta es la salida => true, que por supuesto no está establecida para el usuario objetivo.

Supongo que debería haber optado por un enfoque más simple…

# docker exec -it app rails r 'x=1;User.find(x).user_option.update!(enable_upcoming_change_available_notifications: false)'

y cosas similares. No sé por qué no se me ocurrió pensarlo de esa manera.

Estoy en la app y en rails c, pego eso y se muestra

=> true

Sin embargo, lo verifiqué y sí se ha cambiado a false en la salida tabulada.

Probé iniciar sesión, pero sigo obteniendo el error “Oops”, ¿quizás necesite reconstruir?

Déjame retroceder un poco… lo que estaba haciendo allí era intentar cambiar las preferencias de administrador con la esperanza de que el código que lanza la excepción no necesitara ejecutarse.

Pero lo que realmente queremos es ver si hay un error en el código que necesite corrección, o algo extraño en tu base de datos que no debería estar ahí. O incluso ambas cosas.

El backtrace lleva a este código en app/serializers/current_user_serializer.rb

  def has_new_upcoming_changes
    last_visited = object.custom_fields["last_visited_upcoming_changes_at"]
    return false if last_visited.blank? && object.created_at < Discourse.site_creation_date + 1.hour
    cutoff = last_visited.present? ? Time.zone.parse(last_visited) : object.created_at
    UpcomingChangeEvent.added.not_backfilled.where("created_at > ?", cutoff).exists?
  end

Se podría ejecutar una consulta en el explorador de datos para ver qué valor tiene last_visited_upcoming_changes_at en tus cuentas de administrador.

SELECT 
    ucf.id AS custom_field_id, 
    ucf.user_id, 
    u.username,
    ucf.name, 
    ucf.value 
FROM user_custom_fields ucf
INNER JOIN users u ON u.id = ucf.user_id
WHERE ucf.name = 'last_visited_upcoming_changes_at'
  AND u.admin = true

y eso podría ser fructífero. En mi caso (actualizado recientemente a v2026.7.3), es simplemente una cadena de fecha, lo cual creo que debería ser.

Gracias por esto, está devolviendo dos campos personalizados, para el mismo usuario de administrador anterior, pero ambas entradas con el mismo valor de tiempo:

| last_visited_upcoming_changes_at | 2026-09-22T10:30:47Z |
| last_visited_upcoming_changes_at | 2026-09-22T10:30:47Z |

Mientras que, la nueva cuenta de administrador muestra una marca de tiempo más reciente y solo una entrada de campo personalizado para ese usuario.

| last_visited_upcoming_changes_at | 2026-10-02T08:23:22Z |


Versión actual de Discourse: 2026.10.0-latest