Ошибка 'FAILED' при попытке снять значок 'Bug Reporter'

При попытке убрать звезду с бейджа «Bug Reporter», чтобы выбрать другой бейдж в качестве избранного, возникает ошибка «FAILED». Другие бейджи можно убрать из избранного (разве так говорят?), но этот — нет.
d5693435464e4e6db116d59bfb86b628|видео

3 лайка

Я могу спокойно снять звезду.


Возможно, это связано с тем, что в видео обрывается ваше интернет-соединение? Просто предположение наугад.

1 лайк

Только что попробовал с стабильным Wi-Fi. Ошибка всё ещё появляется.

2 лайка

Эта ошибка существует уже давно. Я исследовал её в прошлом году, и вот шаги для её воспроизведения:

  1. Как администратор, установите max favorite badges (максимальное количество избранных значков) в значение 2 и создайте хотя бы один значок, который можно получить несколько раз.
  2. Как обычный пользователь, добавьте два значка в избранное, один из которых — значок, который можно получить несколько раз (назовём его Значок A).
  3. Как администратор, выдайте пользователю Значок A повторно.
  4. Как обычный пользователь, обновите страницу и попробуйте убрать звезду с Значка A. Вы столкнётесь с ошибкой.

Причина ошибки заключается в том, что каждый раз при выдаче значка, который можно получить несколько раз, в базе данных создаётся новая запись user_badge. Однако, если пользователь уже добавил этот значок в избранное, а затем получил его снова, новая запись user_badge автоматически не помечается как is_favorite. Когда пользователь пытается убрать звезду с Значка A, фронтенд по умолчанию отправляет ID самой свежей записи user_badge. Поскольку эта запись не помечена как is_favorite, бэкенд предполагает, что пользователь пытается добавить новый значок в избранное (вместо того чтобы убрать его из избранного), что превышает лимит max favorite badges, и возникает ошибка.

Соответствующий код находится по адресу:

Одно из возможных решений — изменить строку 131 следующим образом:

if UserBadge.where(badge: user_badge.badge, user: user_badge.user).pluck(:is_favorite).any? &&

Однако это не устраняет полностью несоответствие записей в базе данных.

Как временное решение, обычный пользователь может убрать все значки из избранного, выполнив следующий JavaScript-код в консоли:

const user_name = require("discourse/models/user").default.current().username;
const badges = await require("discourse/models/user-badge").default.findByUsername(user_name);
const favorites = new Map();
badges.filter((b)=>b.is_favorite).forEach((b)=>favorites.set(b.badge_id,b));
favorites.forEach((b)=>b.favorite());
9 лайков

Я только что столкнулся с этой ошибкой, но при копировании и вставке кода в консоль возникает синтаксическая ошибка:

SyntaxError: Unexpected identifier ‘require’. Expected ‘;’ after variable declaration.
SyntaxError: Unexpected identifier ‘identifier’

Возможно, это немного устарело? У кого-то есть обновлённая версия?

Хотел бы также добавить:

1 лайк

Что ж, я убрал звезду с другой своей значки (Empathetic), после чего смог убрать звезду с значки Bug Reporter.

После этого, если я ставил звезду на значку Empathetic, что срабатывало, то установка звезды на значку Aficionado возвращала ту же ошибку. Очень странно.

РЕДАКТИРОВАНИЕ: После перезагрузки страницы между каждой повторной установкой звезды я теперь удалил (иронично) багующую значку Bug Reporter.

Я создал pull request для исправления этой проблемы:

5 лайков

Привет, спасибо за вклад! Я просмотрел твой PR, и в него нужно внести небольшие изменения.

4 лайка

Спасибо за ваш отзыв, я обновил этот PR

3 лайка

Отлично! Это одобрено и слито.

Изменения должны появиться на meta в ближайшее время.

5 лайков

Эта тема была автоматически закрыта через 3 дня. Новые ответы больше не принимаются.