Не удалось загрузить карточку пользователя

После обновления версии я обнаружил, что не могу загрузить карточку пользователя, нажав на его аватар, а при входе в настройки личной информации появляется сообщение, что страница не найдена.

Я обновился вчера, и карточки пользователей загружаются у меня без проблем.

Проверьте безопасный режим. Если всё в порядке, возможно, проблема в одной из ваших тем или компонентов темы?

Не могли бы вы предоставить любые ошибки из консоли?

Я нахожусь в безопасном режиме, но всё равно не могу загрузиться. Вот информация из моего лога:


Не удалось обработать исключение в промежуточном ПО приложения исключений: ActiveRecord::StatementInvalid : PG::UndefinedTable: ОШИБКА: отношение "gamification_leaderboard_cache_1_all_time" не существует СТРОКА 1: ...p.t

ActiveRecord::StatementInvalid (PG::UndefinedTable: ОШИБКА: отношение "gamification_leaderboard_cache_1_all_time" не существует СТРОКА 1: ...p.total_score, p.position FROM "users" INNER JOIN gamificati.

Это может иметь значение, но я имел в виду логи браузера. Можете ли вы их предоставить?

То есть консоль браузера (часто открывается по F1).

topic-creator-avatar.hbr:1 [THEME 300 'Сводка последних тем'] Ошибка компиляции: неизвестное расширение файла 'hbr' (discourse/connectors/topic-list-before-columns/topic-creator-avatar.hbr)
(аноним) @ topic-creator-avatar.hbr:1
[Новое] Используйте Copilot в Edge для объяснения ошибок консоли: нажмите
         
         чтобы объяснить ошибку.
        Узнать больше
        Больше не показывать
composer-action-title.js:62 ℹ️ Discourse v3.5.0.beta5-dev — https://github.com/discourse/discourse/commits/7820dd2b8f — Ember v5.12.0
post-placeholder.js:53  [ПЛАГИН discourse-chain-topics] Уведомление об устаревании: Определение классов-коннекторов через registerConnectorClass устарело. См. https://meta.discourse.org/t/32727 для более современных паттернов. [id устаревания: discourse.register-connector-class-legacy]
o @ post-placeholder.js:53
p @ topic-link.js:12
registerConnectorClass @ group.js:15
(аноним) @ topic-custom-field-initializer.js:32
e1 @ group.js:15
initialize @ topic-custom-field-initializer.js:13
(аноним) @ composer-action-title.js:62
(аноним) @ item.js:166
e.each @ form-template-validation.js:54
e.walk @ form-template-validation.js:54
e.each @ form-template-validation.js:54
e.topsort @ form-template-validation.js:54
_runInitializer @ item.js:166
runInstanceInitializers @ item.js:166
_bootSync @ composer-action-title.js:62
didBecomeReady @ index.js:93
invoke @ client-error-handler.js:88
flush @ client-error-handler.js:88
flush @ client-error-handler.js:88
_end @ client-error-handler.js:88
(аноним) @ client-error-handler.js:88
Promise.then
(аноним) @ client-error-handler.js:88
flush @ bookmark.js:114
_scheduleAutorun @ client-error-handler.js:88
_ensureInstance @ client-error-handler.js:88
schedule @ client-error-handler.js:88
f @ bookmark.js:114
waitForDOMReady @ index.js:93
init @ index.js:93
_ @ caret-position.js:86
create @ caret-position.js:86
(аноним) @ start-app.js:4
(аноним) @ discourse-boot.js:13
(аноним) @ discourse-boot.js:1
post-placeholder.js:53  [ПЛАГИН discourse-chain-topics] Уведомление об устаревании: Определение классов-коннекторов через registerConnectorClass устарело. См. https://meta.discourse.org/t/32727 для более современных паттернов. [id устаревания: discourse.register-connector-class-legacy]
o @ post-placeholder.js:53
p @ topic-link.js:12
registerConnectorClass @ group.js:15
(аноним) @ topic-custom-field-initializer.js:83
e1 @ group.js:15
initialize @ topic-custom-field-initializer.js:13
(аноним) @ composer-action-title.js:62
(аноним) @ item.js:166
e.each @ form-template-validation.js:54
e.walk @ form-template-validation.js:54
e.each @ form-template-validation.js:54
e.topsort @ form-template-validation.js:54
_runInitializer @ item.js:166
runInstanceInitializers @ item.js:166
_bootSync @ composer-action-title.js:62
didBecomeReady @ index.js:93
invoke @ client-error-handler.js:88
flush @ client-error-handler.js:88
flush @ client-error-handler.js:88
_end @ client-error-handler.js:88
(аноним) @ client-error-handler.js:88
Promise.then
(аноним) @ client-error-handler.js:88
flush @ bookmark.js:114
_scheduleAutorun @ client-error-handler.js:88
_ensureInstance @ client-error-handler.js:88
schedule @ client-error-handler.js:88
f @ bookmark.js:114
waitForDOMReady @ index.js:93
init @ index.js:93
_ @ caret-position.js:86
create @ caret-position.js:86
(аноним) @ start-app.js:4
(аноним) @ discourse-boot.js:13
(аноним) @ discourse-boot.js:1
post-placeholder.js:53  [ПЛАГИН discourse-chain-topics] Уведомление об устаревании: Определение классов-коннекторов через registerConnectorClass устарело. См. https://meta.discourse.org/t/32727 для более современных паттернов. [id устаревания: discourse.register-connector-class-legacy]
o @ post-placeholder.js:53
p @ topic-link.js:12
registerConnectorClass @ group.js:15
(аноним) @ topic-custom-field-initializer.js:141
e1 @ group.js:15
initialize @ topic-custom-field-initializer.js:13
(аноним) @ composer-action-title.js:62
(аноним) @ item.js:166
e.each @ form-template-validation.js:54
e.walk @ form-template-validation.js:54
e.each @ form-template-validation.js:54
e.topsort @ form-template-validation.js:54
_runInitializer @ item.js:166
runInstanceInitializers @ item.js:166
_bootSync @ composer-action-title.js:62
didBecomeReady @ index.js:93
invoke @ client-error-handler.js:88
flush @ client-error-handler.js:88
flush @ client-error-handler.js:88
_end @ client-error-handler.js:88
(аноним) @ client-error-handler.js:88
Promise.then
(аноним) @ client-error-handler.js:88
flush @ bookmark.js:114
_scheduleAutorun @ client-error-handler.js:88
_ensureInstance @ client-error-handler.js:88
schedule @ client-error-handler.js:88
f @ bookmark.js:114
waitForDOMReady @ index.js:93
init @ index.js:93
_ @ caret-position.js:86
create @ caret-position.js:86
(аноним) @ start-app.js:4
(аноним) @ discourse-boot.js:13
(аноним) @ discourse-boot.js:1
discourse-home-page.js:79  ошибка discourse-home-page: недопустимый путь ""
s @ discourse-home-page.js:79
initialize @ discourse-home-page.js:42
(аноним) @ composer-action-title.js:62
(аноним) @ item.js:166
e.each @ form-template-validation.js:54
e.walk @ form-template-validation.js:54
e.each @ form-template-validation.js:54
e.topsort @ form-template-validation.js:54
_runInitializer @ item.js:166
runInstanceInitializers @ item.js:166
_bootSync @ composer-action-title.js:62
didBecomeReady @ index.js:93
invoke @ client-error-handler.js:88
flush @ client-error-handler.js:88
flush @ client-error-handler.js:88
_end @ client-error-handler.js:88
(аноним) @ client-error-handler.js:88
Promise.then
(аноним) @ client-error-handler.js:88
flush @ bookmark.js:114
_scheduleAutorun @ client-error-handler.js:88
_ensureInstance @ client-error-handler.js:88
schedule @ client-error-handler.js:88
f @ bookmark.js:114
waitForDOMReady @ index.js:93
init @ index.js:93
_ @ caret-position.js:86
create @ caret-position.js:86
(аноним) @ start-app.js:4
(аноним) @ discourse-boot.js:13
(аноним) @ discourse-boot.js:1
one-version.js:10  УСТАРЕЛО: Компоненты с отдельно разрешаемыми шаблонами устарели. Мигрируйте либо на совместно расположенные файлы js/ts + hbs, либо на gjs/gts. Попытка поиска 'template:components/sidebar-theme-toggle'. [id устаревания: component-template-resolving] Это будет удалено в ember-source 6.0.0. См. https://deprecations.emberjs.com/id/component-template-resolving для подробностей.
(аноним) @ one-version.js:10
(аноним) @ base.js:71
(аноним) @ deprecate.js:100
(аноним) @ base.js:71
(аноним) @ deprecate.js:100
(аноним) @ base.js:71
l @ index.js:49
(аноним) @ render-tags.js:60
(аноним) @ base.js:71
u @ index.js:49
(аноним) @ base.js:71
(аноним) @ base.js:71
(аноним) @ base.js:71
(аноним) @ bookmark.js:114
(аноним) @ base.js:71
(аноним) @ form-template-validation.js:54
(аноним) @ base.js:71
s @ post-placeholder.js:53
(аноним) @ base.js:71
r @ base.js:71
c @ deprecate.js:100
k @ upload.js:65
h @ binary.js:7
(аноним) @ theme-setting.js:6
(аноним) @ theme-setting.js:6
lookupComponent @ theme-setting.js:6
(аноним) @ theme-setting.js:6
A @ theme-setting.js:6
o @ theme-setting.js:6
(аноним) @ theme-setting.js:6
compile @ theme-setting.js:6
ef @ theme-setting.js:6
(аноним) @ theme-setting.js:6
compile @ theme-setting.js:6
compile @ backup-codes.js:33
(аноним) @ backup-codes.js:33
evaluate @ backup-codes.js:33
evaluateSyscall @ backup-codes.js:33
evaluateInner @ backup-codes.js:33
evaluateOuter @ backup-codes.js:33
next @ backup-codes.js:33
_execute @ backup-codes.js:33
execute @ backup-codes.js:33
sync @ backup-codes.js:33
(аноним) @ theme-setting.js:6
(аноним) @ theme-setting.js:6
tA @ backup-codes.js:33
_renderRoots @ theme-setting.js:6
_renderRootsTransaction @ theme-setting.js:6
_renderRoot @ theme-setting.js:6
_appendDefinition @ theme-setting.js:6
appendOutletView @ theme-setting.js:6
invoke @ client-error-handler.js:88
flush @ client-error-handler.js:88
flush @ client-error-handler.js:88
_end @ client-error-handler.js:88
(аноним) @ client-error-handler.js:88
Promise.then
(аноним) @ client-error-handler.js:88
flush @ bookmark.js:114
_scheduleAutorun @ client-error-handler.js:88
_end @ client-error-handler.js:88
(аноним) @ client-error-handler.js:88
Promise.then
(аноним) @ client-error-handler.js:88
flush @ bookmark.js:114
_scheduleAutorun @ client-error-handler.js:88
_end @ client-error-handler.js:88
(аноним) @ client-error-handler.js:88
Promise.then
(аноним) @ client-error-handler.js:88
flush @ bookmark.js:114
_scheduleAutorun @ client-error-handler.js:88
_end @ client-error-handler.js:88
(аноним) @ client-error-handler.js:88
Promise.then
(аноним) @ client-error-handler.js:88
flush @ bookmark.js:114
_scheduleAutorun @ client-error-handler.js:88
_end @ client-error-handler.js:88
(аноним) @ client-error-handler.js:88
Promise.then
(аноним) @ client-error-handler.js:88
flush @ bookmark.js:114
_scheduleAutorun @ client-error-handler.js:88
_end @ client-error-handler.js:88
(аноним) @ client-error-handler.js:88
Promise.then
(аноним) @ client-error-handler.js:88
flush @ bookmark.js:114
_scheduleAutorun @ client-error-handler.js:88
_ensureInstance @ client-error-handler.js:88
schedule @ client-error-handler.js:88
f @ bookmark.js:114
waitForDOMReady @ index.js:93
init @ index.js:93
_ @ caret-position.js:86
create @ caret-position.js:86
(аноним) @ start-app.js:4
(аноним) @ discourse-boot.js:13
(аноним) @ discourse-boot.js:1
includes.js?v=116e2a6fd81c286e004e2a0afb03baa1:840 
            
            
            GET https://www.tometo.me/u/shen_hualuo/card.json 500 (Внутренняя ошибка сервера)
(аноним) @ includes.js?v=116e2a6fd81c286e004e2a0afb03baa1:840
send @ jquery.js:7408
ajax @ jquery.js:7408
a @ base.js:71
(аноним) @ named-references.js:49
e @ named-references.js:49
A @ base.js:71
(аноним) @ moment.js:257
(аноним) @ group.js:15
(аноним) @ named-references.js:49
e @ named-references.js:49
getAndRemove @ group.js:15
findDetails @ moment.js:257
findByUsername @ moment.js:257
_showCallback @ item.js:166
(аноним) @ topic-link.js:12
invoke @ client-error-handler.js:88
flush @ client-error-handler.js:88
flush @ client-error-handler.js:88
_end @ client-error-handler.js:88
end @ client-error-handler.js:88
_runExpiredTimers @ client-error-handler.js:88
setTimeout
setTimeout @ client-error-handler.js:88
_installTimerTimeout @ client-error-handler.js:88
_reinstallTimerTimeout @ client-error-handler.js:88
_later @ client-error-handler.js:88
later @ client-error-handler.js:88
T @ bookmark.js:114
_show @ topic-link.js:12
_showCardOnClick @ topic-link.js:12
_cardClickHandler @ topic-link.js:12
_run @ client-error-handler.js:88
_join @ client-error-handler.js:88
join @ client-error-handler.js:88
p @ bookmark.js:114
(аноним) @ bookmark.js:114

includes.js?v=116e2a…04e2a0afb03baa1:840 
 
 GET https://www.tometo.me/u/shen_hualuo.json 500 (Внутренняя ошибка сервера)
(аноним)	@	includes.js?v=116e2a…04e2a0afb03baa1:840
send	@	jquery.js:7408
ajax	@	jquery.js:7408
a	@	base.js:71
(аноним)	@	named-references.js:49
e	@	named-references.js:49
A	@	base.js:71
(аноним)	@	moment.js:257
(аноним)	@	group.js:15
(аноним)	@	named-references.js:49
e	@	named-references.js:49
getAndRemove	@	group.js:15
findDetails	@	moment.js:257
afterModel	@	post-placeholder.js:53
runAfterModelHook	@	topic-link.js:12
(аноним)	@	topic-link.js:12
k	@	named-references.js:49
w	@	named-references.js:49
invoke	@	client-error-handler.js:88
flush	@	client-error-handler.js:88
flush	@	client-error-handler.js:88
_end	@	client-error-handler.js:88
(аноним)	@	client-error-handler.js:88
Promise.then		
(аноним)	@	client-error-handler.js:88
flush	@	bookmark.js:114
_scheduleAutorun	@	client-error-handler.js:88
_ensureInstance	@	client-error-handler.js:88
schedule	@	client-error-handler.js:88
(аноним)	@	hashtag-autocomplete.js:158
T	@	named-references.js:49
resolve	@	topic-link.js:12
T	@	form-template-validation.js:54
getTransitionByIntent	@	topic-link.js:12
transitionByIntent	@	topic-link.js:12
doTransition	@	topic-link.js:12
transitionTo	@	topic-link.js:12
_doTransition	@	upload.js:65
transitionTo	@	binary.js:7
(аноним)	@	theme-setting.js:6
l	@	UIPlugin.js:138
click

Похоже, вы не находились в безопасном режиме.

Этот компонент, судя по всему, вызывает проблему:

topic-creator-avatar.hbr:1  [THEME 300 'Свежие темы'] Ошибка компиляции: неизвестное расширение файла 'hbr' (discourse/connectors/topic-list-before-columns/topic-creator-avatar.hbr)
(anonymous) @ topic-creator-avatar.hbr:1

Это связано с тем, что шаблоны hbr (raw) больше не поддерживаются.

Обратитесь к автору этой темы.

@manuel, ты тоже с этим сталкивался?

Похоже, эти сообщения связаны.

Кажется, плагин Gamification изменяет данные пользователя и вызывает ошибку.

Это почти наверняка объясняет, почему карточка пользователя не загружается.

Похоже, у вас есть несколько проблем, связанных с дополнениями, а не с ядром Discourse.

Рекомендую временно отключить:

  • Плагин Gamification
  • Любой компонент темы ([THEME 300 ‘Последние темы вкратце’]), вызывающий другую ошибку в браузере (его нужно переписать, чтобы избежать использования шаблонов .hbr)

пока вы не решите эти проблемы.

Рекомендую сообщить об ошибке Gamification в теме Gamification.

Так как это официальный плагин, вы также можете сообщить об ошибке в категории bug (но не забудьте добавить тег gamification). :partying_face:

Это правда.

В любом случае, эта тема сейчас затрагивает две проблемы, и их, вероятно, следует разделить на две отдельные.

Проблема с загрузкой карточки пользователя, скорее всего, связана с системой геймификации, поэтому, возможно, стоит использовать эту тему именно для неё. Добавлен тег gamification.

(ладно, ТЕПЕРЬ это запутывает — интерфейс редактирования метаданных темы изменился!)

Да.

Скриншот от 2025-05-13 11-54-39

Это произошло, когда я пытался установить резервную копию. Доступ к карточкам пользователей и страницам пользователей не работал, пока я не удалил таблицу лидеров из резервной копии.

редактирование: к слову, похоже, мой скриншот не открывается в лайтбоксе? Загруженное изображение было шириной 1693 пикселя, но отображается только в 690 пикселей.

Это кажется очень жестким. Неужели нет более легкого решения?

Это, возможно, связано:

Да, странно. Вот оригинал для тех, кто хочет реально прочитать текст :slight_smile:

Возможно. Эта миграция удаляет версионированные представления кэша, у которых в конце добавлен _x (где x — цифра). Но таблица, которую она пропускает, является неверсионированной (без _x).

@sheng_hualuo, не могли бы вы запустить это из консоли Rails?

DiscourseGamification::LeaderboardCachedView.regenerate_all

gamification_leaderboard_cache_1_all_time разве это не версия 1?

Кажется, по какой-то причине соглашение об именовании было изменено.

Нет, это идентификатор таблицы лидеров. Всё подробно объяснено в сообщении коммита, на который вы ссылаетесь.

Также обратите внимание на регулярное выражение 'gamification_leaderboard_cache_[0-9]+_[a-zA-Z_]+_[1-9]$'.

Ах, теперь всё начинает обретать смысл. Значит, версия с номером (э-э-э) была отброшена, но по какой-то причине новая версия (э-э-э) не была реализована.

У меня нет полного лога трассировки, но, по-моему, ошибка возникает при сериализации gamification_score для карточки пользователя.

Учитывая временный характер этих материализованных представлений, запрос к оценке не должен вызывать ошибку во всей системе; при отсутствии представления должен срабатывать откат к «оценке по умолчанию».

В коде проверки существования материализованного представления есть ошибка. Он сообщает, что представление существует, хотя на самом деле его нет (по крайней мере, в текущей схеме public). Из-за этого попытка запроса к несуществующему представлению приводит к ошибке.

Скорее всего, произошло следующее: материализованное представление присутствовало в схеме backup, созданной в процессе восстановления, но отсутствовало в схеме public. Схема backup сохраняется некоторое время после восстановления.

У меня уже готов PR с исправлением.