GitのハングとAdmin/ModユーザーアカウントのOopsエラーページ

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

ログイン時の**「Oops Page」エラー**の問題を再現しました。この問題は管理者にのみ影響し、場合によっては他のスタッフアカウントにも影響を与えるようです。今回のケースでは管理者アカウントが対象ですが、影響を受けるのは “git hang” によって事前に関連付けられている管理者アカウントのみです。別のログインを試みることで再現しました。

その後、/logs の出力機能の仕組みに詳しくなったので、ログを確認しました。この機能は素晴らしいですね!

このエラーは「致命的なエラー」として表示され、22日から発生しています。“git hang” の問題に非常によく似ていますが、今回のケースでは、現時点までのさまざまなリビルドにもかかわらず未解決のままです。つまり、一部の管理者アカウントが事実上ロックアウトされている状態です。詳細情報とバックトレースログを以下に示します:

情報

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

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

同様の状況にある方のために、Discourse インスタンスへの管理者アクセスを可能にした、機能するワークアラウンドは、./launcher enter app を実行してアプリに入ってから、rake create:admin コマンドを使用して新しい管理者ユーザーアカウントを作成することでした。

ただし、これでは本質的な問題は解決しません。既存の管理者アカウントは依然として Oops エラーページが表示され、通常通りログインできない状態が続いています。

この問題に対する修正がいつか行われることを期待しています。事前に、ご意見やヒントをいただければ幸いです。


関連する可能性のあるトピック:

標準的なDiscourseの機能を使って問題を回避できないかと思い、ユーザーアカウントの「マージ」機能を使えないかと考えました。例えば、新しい管理者アカウントを作成し、それを元の管理者アカウントにマージする(スタッフはコンソール経由で実行する必要があります)という方法です。

もう一つのアイデアは、管理者権限を一度取り除いてから再付与することですが、取り除くことで何か問題が起きるかどうかは分かりません。

これは私の「とりあえず試してみる」的な発想で、上記のことはまだ試していませんが、トピックを投稿してから、エラーでロックアウトされた管理者アカウントに所有権を変更してみたところ、Discourseの post-notice new-user によって以下の通知が表示されました:

:tada: [ユーザー名] が初めて投稿しました — サイトへようこそ!

ああ、まるで(所有権変更の)投稿時点で、その管理者アカウントが存在しなかったかのようです。

これは何かを示唆しているのでしょうか? :thinking:

それらは単なる「警告」だと思っていたので、あまり気にしていなかったのですが、上記の ActiveVIEW::Tempalte::Error より前に、同時に MaxMindDB のエラーが発生しています。

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

ENV タブには

Jobs::SuspiciousLogin

が確認できました。

おそらく、この MaxMindDB の致命的ではないエラー(警告)が、Admin ユーザーアカウントのログインをブロックし、何らかの理由で「Oops」ページを表示させているのか、あるいはここでのバグの一部なのでしょうか?

これは、手作業で設定した MaxMind の設定ミスによるケースでしょうか?

Maxmindファイルへのアクセスが一部の地域ではブロックされています。特に中国で確認しています。

ありがとうございます。ただ、このDiscourseサーバーは中国にありませんし、ログインしようとしている管理者ユーザーの所在地も中国ではありません。また、MaxMindDBはそもそも設定されたことがないか、仮に部分的に設定されていても最終的な設定が完了していないと思います。

管理者画面にMaxMindDBの設定項目があったような記憶がうっすらありますが、今は何も見当たりません。

さらに、あることに気づきました。/logs を見るには管理者としてログインしている必要があります。つまり、該当する管理者ユーザーはログを見ることができ、そこから「サイトに戻る」リンクを使って /admin に移動できますが、そこで脈打つUFOのオーブ(青い円が5つ)が表示されます。つまり、回り道ではありますが、少なくとも「Oops」ページは過ぎているものの、まだログインできていない状態です。:thinking:

ログを見ると、この回り道な操作がOPのエラーをさらに増やしているのがわかります。

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

通話はサーバー側から行われるため、ダイヤルインの所在地は無関係です。確認する価値はあります。

わかりました。ただ、サーバーは中国にはありません。

あれはただの例えだよ。

ああ、そうか、もちろん…! :grin: この場合、何をチェックすればいいのか少し迷っているんだ。

@merefield @Ed_S @Falco このエラーに似たものを1つだけ見つけることができました。Error "no implicit conversion of Array into String" when using Gemini AI analysis on posts with images です。もしかしたら、このトピックは Contribute > Bug セクションに投稿すべきだったのかもしれません。

どうやら、予定されている変更を提示する機能に関係しているようです。これは管理者のみが表示できる内容です。ask.discourse.com によると、

この機能全体は、Rails コンソールで false に設定される非公開のサイト設定 enable_upcoming_changes によって制御されます:

SiteSetting.enable_upcoming_changes = false

ただし、これにはターミナル/サーバーへのアクセスが必要であるため、セルフホスト環境でのみ実行可能です。

ありがとう、そのコマンドをrails consoleで実行してみましたが、「command not found」と表示されました :thinking:

ああ、ごめん。LLMが古い情報を提供していたみたい。

試して使ったコマンドをいくつか紹介するね。

管理者ユーザーと、予定されている変更に関する設定値をテーブル形式で表示するには:

# 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

特定のID(私の場合は1)について、その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)'

もちろん、dockerに入ってrailsに入り、そこで操作することも可能だが、私はルートシェルからのワンライナーの方が好みだ。

私はいつも少し混乱してしまうのですが、root shell というのは ./launcher enter app を実行して rails c を開くことのことですか?

では、出力結果は以下の通りです:

-1 system true

旧管理者や新管理者、discobot、あるいはその他のユーザーはリストに載っていません。

おそらくこれが問題の原因で、該当する管理者ユーザーに対して適用/有効化されている必要があるのではないでしょうか。そうであれば、そのIDをどうやって調べるのですか?

コマンドを再度実行してIDを確認したところ、1でした。つまり、同じ設定です。

しかし、以下のコマンドを入力して実行すると、=> true が表示されます。

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

本来は false になるべきだと思うのですが、このコマンドで何を修正すればよいのか見当がつきません。このアクションは「find」するだけで、それ以上の処理は行っていないと理解していますが、結果は => true になっています。もちろん、これは対象ユーザーに対して設定されていない状態です。

もっとシンプルなアプローチでよかったのかもしれない…

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

など。なぜそのように思いつかなかったのか、自分でもわからない。

アプリ内と rails c にいて、それを貼り付けると出力されるのは

=> true

です。しかし、確認したところ、テーブル形式の出力では 確かに false に変わっていました。

ログインも試してみましたが、まだ「Oops」が表示されます。リビルドが必要なのでしょうか?

少し戻りますが… 在那里で私がやろうとしていたのは、例外を投げるコードが実行される必要がなくなることを期待して、管理者の設定を変更することでした。

しかし、本当に知りたいのは、修正が必要なコードのバグがあるのか、それともデータベースに存在すべきでない奇妙なデータがあるのか、あるいはその両方かということです。

バックトレースは 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

データエクスプローラーのクエリを実行して、管理者アカウントの last_visited_upcoming_changes_at の値が何になっているかを確認することができます。

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

これにより、有益な情報が得られるかもしれません。私の場合(最近 v2026.7.3 に更新しました)は、単なる日付文字列であり、本来そうあるべきだと思います。

ありがとうございます。同じ古い管理者ユーザーに対して、カスタムフィールドが2つ返ってきましたが、両方のエントリの時刻値は同一です:

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

一方、新しい管理者アカウントでは、そのユーザーのカスタムフィールドエントリが1つのみで、より新しいタイムスタンプが表示されています。

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


現在のDiscourseバージョン: 2026.10.0-latest