Il blocco di Git e l'errore Oops nella pagina di errore per gli account di Admin/Mod

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

Ho ricreato il problema dell’errore nella pagina Oops del login, che sembra interessare solo gli amministratori e, in alcuni casi, altri account del personale, ma in questo caso si tratta di un account Admin, e solo di quegli account Admin che sono stati precedentemente soggetti a “git hang”, semplicemente tentando un altro login.

Ho quindi controllato i log, ora che sono più familiare con il funzionamento della funzione di output dei /logs, che è eccellente!

Questo errore appare come un “errore fatale” ed è iniziato il 22, sembrando molto simile al problema del “git hang”, ma in questo caso rimane irrisolto nonostante vari rebuild fino a questo punto, il che significa che alcuni account admin sono essenzialmente bloccati; si prega di consultare le informazioni e i log di backtrace di seguito:

Info

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

Per chiunque si trovi in una situazione simile, la soluzione alternativa funzionante che ha consentito l’accesso admin all’istanza discourse è stata quella di creare un nuovo account utente admin utilizzando il comando rake create:admin dopo essere entrati nell’app tramite ./launcher enter app

Tuttavia, questo non risolve in definitiva il problema in oggetto, poiché gli account Admin esistenti vengono ancora accolti dalla pagina di errore Oops e non possono effettuare il login come al solito.

Spero che ci sia una soluzione per questo problema in un momento o nell’altro e apprezzo in anticipo qualsiasi approfondimento o suggerimento.


Argomenti potenzialmente correlati:

Nel tentativo di trovare una soluzione a sorpresa utilizzando le funzionalità standard di Discourse, mi sono chiesto se unire gli account degli utenti potesse funzionare: ad esempio, creare un nuovo account di amministratore e poi unirlo a quello dell’utente amministratore originale (per il personale, questa operazione deve essere eseguita tramite la console).

L’altra idea era revocare e poi riassegnare lo stato di amministratore, ma non so se una revoca potrebbe causare problemi.

Si tratta di un ragionamento un po’ improvvisato da parte mia e non ho ancora provato nessuna delle soluzioni sopra descritte. Tuttavia, ho sperimentato pubblicando un argomento e poi cambiandone la proprietà all’utente amministratore bloccato a causa dell’errore. A quel punto, questa notifica di Discourse post-notice new-user ha mostrato il seguente messaggio:

:tada: Questo è il primo post di [nome utente] — diamogli il benvenuto sul sito!

Oh, che sfortuna: sembra che l’utente amministratore non fosse mai esistito fino a quel punto (il post in cui ho cambiato la proprietà).

Potrebbe essere un indizio di qualcosa? :thinking:

Non stavo prestando attenzione perché erano solo “avvisi”, ma si verifica un errore MaxMindDB nello stesso momento, sebbene preceda l’errore ActiveVIEW::Tempalte::Error sopra indicato.

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

Nella scheda ENV ho notato

Jobs::SuspiciousLogin

Forse questo errore non fatale di MaxMindDB, che è solo un avviso, sta bloccando l’accesso dell’utente Admin ma sta servendo la pagina Oops per qualche ragione o fa parte del bug in questione?

Si tratta di un problema di configurazione errata di MaxMind creato a mano?

L’accesso ai file Maxmind è bloccato in alcune regioni. In particolare, ho riscontrato questo problema in Cina.

Grazie, beh, questo server Discourse non si trova in Cina e nemmeno l’utente admin che sta cercando di accedere, e non credo che MaxMindDB sia mai stato configurato, o se parzialmente, non è mai stato completato.

Ricordo vagamente le impostazioni di MaxMindDB nell’area di amministrazione, ma ora non riesco a trovarle.

Ho anche appena notato qualcosa: per vedere /logs è necessario essere registrati come amministratore, quindi l’utente admin in questione può visualizzare i log e da lì può navigare verso /admin utilizzando il link “torna al sito”, ma si imbatte nelle orb UFO pulsanti (5 cerchi blu), quindi è almeno oltre la pagina Oops, sebbene in modo piuttosto contorto, ma non è ancora dentro. :thinking:

Posso vedere nei log che questa attività contorta sta generando più errori dell’OP.

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

la chiamata viene effettuata dal server, la posizione del dial-in è irrilevante - vale la pena verificarlo

Ok, ma il server non si trova in Cina.

quello era solo un esempio.

Ah, sì, certo.. d’oh! :grin: Non sono solo sicuro di cosa dovrei controllare in questo caso.

@merefield @Ed_S @Falco l’unica istanza di questo errore che riesco a trovare e che sembra simile è qui Error "no implicit conversion of Array into String" when using Gemini AI analysis on posts with images forse avrei dovuto pubblicare questo argomento nella sezione Contribute > Bug?

Sembra qualcosa legato alla presentazione delle modifiche imminenti: una funzione che solo gli amministratori possono visualizzare. Secondo ask.discourse.com

L’intera funzionalità è controllata da un’impostazione del sito nascosta chiamata enable_upcoming_changes, impostata su false in una console Rails:

SiteSetting.enable_upcoming_changes = false

Tuttavia, questo richiede l’accesso al terminale/al server, quindi è possibile solo nelle installazioni self-hosted.

Grazie, ho eseguito quel comando nella console di Rails ma mi ha risposto “command not found” :thinking:

ok, scusa, risulta che l’LLM mi abbia fornito informazioni non aggiornate.

ecco alcuni comandi che ho provato e utilizzato.

per tabulare gli utenti admin e il valore della loro impostazione relativa ai cambiamenti imminenti:

# 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

per un id dato - nel mio caso 1 - per invertire l’impostazione per quell’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)'

Preferisco di gran lunga il one-liner dalla shell di root, ovviamente si potrebbe entrare in docker e poi in rails per eseguire le azioni, se si preferisce.

Mi trovo sempre un po’ disorientato, quindi per root shell intendi entrare tramite ./launcher enter app e poi usare rails c?

Ok, l’output:

-1 system true

Nessun admin vecchio o nuovo, discobot o nessun altro è tabellato.

Forse è questo il problema: è necessario applicarlo/attivarlo per l’utente admin in questione. In tal caso, come si trova il suo id?

Ok, ho eseguito di nuovo il comando e ho trovato l’id, che è 1, quindi la configurazione è la stessa.

Tuttavia, quando inserisco il comando seguente ed eseguo il codice, viene restituito => true

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

Vogliamo che sia false, giusto? Quindi non riesco a capire cosa dovrebbe essere modificato in quel comando. Ho letto l’azione come “find” e nient’altro; questo è l’output => true, che ovviamente non è stato impostato per l’utente di destinazione.

Immagino che avrei dovuto optare per un approccio più semplice…

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

e cose simili. Non so perché non mi sia venuto in mente di procedere in questo modo.

Sono nell’app e in rails c, incollando il codice viene restituito

=> true

Tuttavia, ho controllato e nel output tabellare è diventato false.

Ho provato ad accedere, ma continua a dare errore. Forse devo ricostruire?

Lasciatemi tornare indietro… ciò che stavo facendo in quel momento era cercare di modificare le preferenze dell’amministratore nella speranza che il codice che genera l’eccezione non dovesse essere eseguito.

Ma ciò che ci interessa davvero è verificare se esiste un bug nel codice che necessita di una correzione, o qualcosa di anomalo nel vostro database che non dovrebbe esserci. O forse entrambe le cose.

Il backtrace porta a questo codice in 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

Si potrebbe eseguire una query tramite data explorer per vedere quale valore di last_visited_upcoming_changes_at hanno i vostri account di amministratore.

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

e ciò potrebbe essere utile. Nel mio caso (aggiornato di recente a v2026.7.3) è semplicemente una stringa di data, che credo sia il formato corretto.

Grazie per la risposta, viene restituito con due campi personalizzati, per lo stesso vecchio utente amministratore, ma entrambe le voci con un valore di tempo identico:

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

Mentre il nuovo account amministratore mostra un timestamp più aggiornato, con una sola voce di campo personalizzato per quell’utente.

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


Versione attuale di Discourse: 2026.10.0-latest