アバターセレクターのモーダルが「t.split is not a function」でクラッシュする (avatar-selector.gjs)

概要:
アバターセレクタのモーダル(プロフィールアバターを変更するため)を開くと、JavaScript エラーが発生し、ポップアップが正しく動作しません。

Discourse バージョン: v2026.7.0-latest (コミット 59588b5d2a)
Ember バージョン: v6.10.1

再現手順:

  1. ユーザープロフィールに移動する
  2. アバター変更のオプションをクリックする
  3. アバターセレクタのモーダルが開く(スタックトレースに基づくと、「解決済み」移動確認モーダルフローによってトリガーされる)
  4. ブラウザコンソールに即座にエラーが表示され、モーダルが正しく動作しない

期待される動作:
アバターセレクタが通常通り開き、ユーザーがアバターを選択またはアップロードできること。

実際の動作:
コンソールで avatar-selector.gjsselectableAvatars ゲッター内で TypeError: t.split is not a function が発生する。

既に実施したトラブルシューティング:

  • すべてのテーマとプラグインを無効にしたセーフモードでテストしましたが、エラーは依然として発生するため、これはテーマやプラグインによるものではないようです。

ブラウザ / OS:

Brave / Windows 11

コンソールログ / スタックトレース:
```
?safe_mode=no_themes,no_plugins:346 GET https://static.cloudflareinsights.com/beacon.min.js/v4513226cdae34746b4dedf0b4dfa099e1781791509496 net::ERR_BLOCKED_BY_CLIENT
app.js:365 :information_source: Discourse v2026.7.0-latest — Commits · discourse/discourse · GitHub — Ember v6.10.1
avatar-selector.gjs:47 Uncaught (in promise) TypeError: t.split is not a function
at get selectableAvatars (avatar-selector.gjs:47:47)
at R (cache-DtDz7X5V.js:1647:15)
at index.js:87:32
at index.js:64:37
at zn (index.js:396:5)
at j (index.js:62:16)
at index-DaCZcoCY.js:4335:20
at index.js:64:37
at zn (index.js:396:5)
at j (index.js:62:16)
at index-DaCZcoCY.js:4335:20
at index.js:64:37
at zn (index.js:396:5)
at j (index.js:62:16)
at index.js:158:20
at index.js:64:37
at zn (index.js:396:5)
at j (index.js:62:16)
at Object.evaluate (index.js:1970:16)
at Object.evaluate (index.js:103:106)
at zb.evaluateSyscall (index.js:2873:20)
at zb.evaluateInner (index.js:2852:64)
at zb.evaluateOuter (index.js:2849:10)
at e.next (index.js:4167:45)
at e._execute (index.js:4157:21)
at e.execute (index.js:4133:41)
at _x.handleException (index.js:3450:19)
at bx.handleException (index.js:3592:52)
at hx.throw (index.js:3414:16)
at iy.evaluate (index.js:565:37)
at hx._execute (index.js:3401:34)
at hx.execute (index.js:3393:17)
at xx.rerender (index.js:3610:8)
at ww.render (index-DaCZcoCY.js:5211:23)
at index-DaCZcoCY.js:5409:16
at xb (index.js:2414:7)
at e.renderRoots (index-DaCZcoCY.js:5389:7)
at #o (index-DaCZcoCY.js:5374:12)
at e.revalidate (index-DaCZcoCY.js:5435:10)
at invoke (index.js:264:14)
at Rc.flush (index.js:180:11)
at zc.flush (index.js:334:19)
at pl._end (index.js:762:32)
at _boundAutorunEnd (index.js:499:12)
selectableAvatars @ avatar-selector.gjs:47
_getProp @ cache-DtDz7X5V.js:1647
(anonymous) @ index.js:87
(anonymous) @ index.js:64
track @ index.js:396
valueForRef @ index.js:62
(anonymous) @ index-DaCZcoCY.js:4335
(anonymous) @ index.js:64
track @ index.js:396
valueForRef @ index.js:62
(anonymous) @ index-DaCZcoCY.js:4335
(anonymous) @ index.js:64
track @ index.js:396
valueForRef @ index.js:62
(anonymous) @ index.js:158
(anonymous) @ index.js:64
track @ index.js:396
valueForRef @ index.js:62
(anonymous) @ index.js:1970
evaluate @ index.js:103
evaluateSyscall @ index.js:2873
evaluateInner @ index.js:2852
evaluateOuter @ index.js:2849
next @ index.js:4167
_execute @ index.js:4157
execute @ index.js:4133
handleException @ index.js:3450
handleException @ index.js:3592
throw @ index.js:3414
evaluate @ index.js:565
_execute @ index.js:3401
execute @ index.js:3393
rerender @ index.js:3610
(anonymous) @ index-DaCZcoCY.js:5211
(anonymous) @ index-DaCZcoCY.js:5409
inTransaction @ index.js:2414
renderRoots @ index-DaCZcoCY.js:5389
#o @ index-DaCZcoCY.js:5374
revalidate @ index-DaCZcoCY.js:5435
invoke @ index.js:264
flush @ index.js:180
flush @ index.js:334
_end @ index.js:762
(anonymous) @ index.js:499
Promise.then
(anonymous) @ index.js:18
flush @ index.js:29
_scheduleAutorun @ index.js:928
_end @ index.js:768
(anonymous) @ index.js:499
Promise.then
(anonymous) @ index.js:18
flush @ index.js:29
_scheduleAutorun @ index.js:928
_end @ index.js:768
(anonymous) @ index.js:499
Promise.then
(anonymous) @ index.js:18
flush @ index.js:29
_scheduleAutorun @ index.js:928
_ensureInstance @ index.js:919
ensureInstance @ index.js:731
scheduleRevalidate @ index-DaCZcoCY.js:4146
dirtyTag @ index.js:229
dirtyTagFor @ index.js:848
setter @ index.js:871
set @ cache-DtDz7X5V.js:1886
show @ modal.js:57
await in show
showAvatarSelector @ account.js:43
_join @ index.js:788
join @ index.js:605
join @ index.js:152
(anonymous) @ route-action.js:48
(anonymous) @ index.js:2534
(anonymous) @ d-button.gts:216
invoke @ index.js:264
flush @ index.js:180
flush @ index.js:334
_end @ index.js:762
end @ index.js:565
_runExpiredTimers @ index.js:869
setTimeout
setTimeout @ index.js:39
_installTimerTimeout @ index.js:912
_reinstallTimerTimeout @ index.js:896
_later @ index.js:829
later @ index.js:652
next @ index.js:562
_triggerAction @ d-button.gts:213
click @ d-button.gts:167
```

「いいね!」 2

この問題はメタでも再現できますか?

上記のエラーメッセージはあなたのインスタンスからのもので、Cloudflare を通じてアクセスしていますか? この部分からそう推測されます。

「いいね!」 1

こんにちは

返信と指摘をありがとうございます。

ご質問にお答えします:いいえ、meta.discourse.org 自体では再現せず、私の独自フォーラムでのみ発生します。

Cloudflare について:はい、私のフォーラムは Cloudflare の背後にありますが、その特定のコンソール行(beacon.min.js / ERR_BLOCKED_BY_CLIENT)は実際のバグとは無関係です。これは Brave Shields が Cloudflare の分析スクリプトをブロックしているために発生しています。Brave Shields を完全に無効にするとその行は消えますが、アバターセレクターのエラー(TypeError: t.split is not a function)は以前と同じように発生します。

背景として:私は約3年間 Cloudflare の背後でフォーラムを運用しており、プロファイルアバターの変更はこれまで常に問題なく動作していました。したがって、これは長年の Cloudflare 関連の問題というよりも、回帰(regression)のように思えます。

meta では再現しないため、これは私の設定に特有のものかもしれません。問題を絞り込むのに役立つ設定やログがあれば、喜んで調査します。確認すべき項目(例:「選択可能なアバター」のサイト設定値、またはスタックトレースでこのモーダルをトリガーしているものとして表示されている Solved プラグインに関連するものなど)があれば教えてください。

調査していただきありがとうございます。

「いいね!」 2

うん、その通り、Cloudflare ではない可能性が高いね。

別のインスタンスでテストしました。ここでは選択可能なアバターのみを有効化しました。2つのアバターをアップロードする必要があります(サイト設定の要件)し、その後有効化しました。

これらの2つの設定を変更して、あなたの側で何か変化があるか確認できますか?

「いいね!」 2

こんにちは、

この件を調べていただきありがとうございます。あなたの指摘は正しかったです。

ご提案通り、「選択可能なアバター」設定に2つのアバターをアップロードしたところ、エラーは解消されました。アバターセレクターは正常に開き、動作するようになりました。

つまり、根本原因は以下のようです。「選択可能なアバター」が有効化されているものの、アップロードされたアバターの数が必須数に満たない(または空)場合、モーダルが適切に失敗処理を行わずにクラッシュしてしまいます。私の場合、アバターを一切アップロードせずに設定を有効化していたため、t.split is not a function エラーが発生しました。

依然として、これはコア側で修正すべき問題だと考えています。設定が誤っていても、モーダルが未処理のTypeErrorを発生させ、アバター選択機能を完全に壊すべきではありません。理想的には、以下のいずれかの挙動になるべきです。

  • リストが空または無効な場合、「選択可能なアバター」機能をスキップして、通常のアバター選択にフォールバックする
  • 静かなJSクラッシュではなく、明確なバリデーションエラーを表示する

この件を特定する上でご協力いただき、本当にありがとうございました!

「いいね!」 2

うん、その意見ももっともだ。修正を提出する気はある? もし慣れているなら、プルリクエストを受け入れるよ。

「いいね!」 1

ソフトウェア開発には携わっていますが、この種の作業については経験が浅いため、自分で修正を提出して間違ったものにしてしまうことを恐れて、少しためらっています。もしコアチームの誰かがここから引き継いでくれるなら、それは素晴らしいことです。必要であれば、GitHubでIssueを作成することもできます。

「いいね!」 3

問題ありません、これで解決するはずです: DEV: Fix JS error in modal when selected avatars is misconfigured - Pull Request #41663 - discourse/discourse - GitHub

「いいね!」 1