Геймификация Discourse — ошибка 404 / MissingAttributeError на маршруте /leaderboard

Итак, я недавно решил включить геймификацию и сразу столкнулся с проблемой: маршрут /leaderboard возвращал ошибку 404. На бэкенде было более 800 тысяч записей о баллах, права доступа проверены, но сама страница не загружалась.

Проверка логов сервера показала:
ActiveModel::MissingAttributeError (отсутствует атрибут 'admin' для User)

Изучая код плагина, я заметил в файле lib/discourse_gamification/leaderboard_cached_view.rb, что запрос к пользователям использует конкретную строку .select для извлечения столбцов для таблицы лидеров:

.select(
"users.id, users.name, users.username, users.uploaded_avatar_id, p.total_score, p.position",
)

Поскольку users.admin и users.moderator не включены в этот запрос, созданные объекты пользователей не имеют доступа к этим полям. Похоже, что где-то дальше по цепочке во время сериализации или рендеринга основного макета выполняется проверка на принадлежность к персоналу для этих пользователей, из-за чего Rails выбрасывает MissingAttributeError и возвращает ошибку 404.

Я вручную отредактировал этот файл, добавив users.admin и users.moderator в блок .select:

.select(
  "users.id, users.name, users.username, users.uploaded_avatar_id, users.admin, users.moderator, p.total_score, p.position",
)

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

Я предполагаю, что это ошибка (?), или я что-то полностью переоценил/упустил?

Сайт сейчас работает на версии v2026.6.0-latest (47a830330f).

2 лайка

Ошибка и ваше объяснение совпадают. К сожалению, мне не удалось воспроизвести проблему ни в версии 47a830330f, ни в ветке main. Я пробовал зайти как администратор и как обычный пользователь — в обоих случаях всё загружается корректно.

В качестве проверки хочу уточнить: вы используете версию плагина gamification, которая поставляется в составе ядра Discourse, и у вас не установлен старый отдельный плагин?

Можете ли вы предоставить более полный стек трассировки, указывающий, где именно возникает ошибка MissingAttributeError?

1 лайк

@ted,

На самом деле, вы можете смело игнорировать это. В итоге я проследил проблему до плагина, который подключался к UserScoreSerializer и реализовывал собственное узкое предложение .select(). Изначально это не было очевидно, так как в /logs для MissingAttributeError не предоставлялся стек-трейс. Только после тщательного анализа и ручного вызова через Rails, чтобы получить полный стек-трейс, мне удалось точно определить проблемный плагин.

Спасибо и извините за ложную тревогу!

2 лайка

Ничего страшного! У вас возникла проблема, и вы написали об этом. Рад, что всё удалось решить. :slightly_smiling_face: