Erreur 'ÉCHEC' lors de la tentative de désétoiler le badge 'Bug Reporter'

Lorsque j’essaie de supprimer l’étoile de mon badge “Bug Reporter” pour utiliser un autre badge comme favori, j’obtiens une erreur “FAILED”. D’autres badges peuvent être désélectionnés (est-ce même un mot ?), mais celui-ci ne peut pas l’être.

3 « J'aime »

Je suis capable de le désépingler sans problème.


Cela pourrait-il être lié à une perte de connexion Internet dans la vidéo ? Juste une supposition.

1 « J'aime »

Je viens de l’essayer avec une connexion Wi-Fi stable. J’obtiens toujours l’erreur.

2 « J'aime »

Ce bug existe depuis longtemps. Je l’ai recherché l’année dernière, et voici les étapes pour le reproduire :

  1. En tant qu’administrateur, définissez max favorite badges sur 2 et créez au moins un badge qui peut être gagné plusieurs fois.
  2. En tant qu’utilisateur normal, définissez deux badges comme favoris, dont l’un est le badge qui peut être gagné plusieurs fois (désigné ici par Badge A).
  3. En tant qu’administrateur, accordez à nouveau le Badge A à l’utilisateur.
  4. En tant qu’utilisateur normal, actualisez la page et essayez de désépingler le Badge A. Vous rencontrerez une erreur.

La raison de l’erreur est que chaque fois qu’un badge pouvant être gagné plusieurs fois est accordé, un nouvel enregistrement user_badge est créé dans la base de données. Cependant, lorsque l’utilisateur a mis le badge en favori et le reçoit à nouveau, le nouvel enregistrement user_badge n’est pas automatiquement marqué comme is_favorite. Lorsque l’utilisateur essaie de désépingler le Badge A, le frontend envoie par défaut l’ID user_badge le plus récent. Comme cet enregistrement n’est pas marqué comme is_favorite, le backend suppose que l’utilisateur essaie de définir un nouveau badge comme favori (au lieu de le désépingler), ce qui dépasse la limite max favorite badges, entraînant ainsi l’erreur.

Le code pertinent se trouve ici :

Une solution possible consiste à modifier la ligne 131 comme suit :

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

Cependant, cela ne résout pas entièrement l’incohérence des enregistrements de la base de données.

En tant que solution de contournement temporaire, un utilisateur normal peut désépingler tous les badges en exécutant le code JavaScript suivant dans la console :

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 « J'aime »

Je viens de rencontrer cette erreur, mais copier-coller le code dans la console renvoie une erreur de syntaxe :

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

Peut-être est-ce un peu obsolète ? Quelqu’un a une version mise à jour ?

J’aimerais également ajouter :

1 « J'aime »

Eh bien, j’ai retiré l’étoile de mon autre badge (Empathique), puis j’ai pu retirer l’étoile du badge Reporter de bugs.

Après cela, si j’avais mis une étoile au badge Empathique, ce qui a fonctionné, mettre une étoile à Aficionado a renvoyé cette erreur. Très étrange.

EDIT : Après avoir rechargé la page entre chaque ré-étoile, j’ai maintenant retiré le badge Reporter de bugs (ironiquement) défectueux.

J’ai créé une PR pour corriger ce problème :

5 « J'aime »

Salut, merci pour ta contribution ! J’ai examiné ta PR et elle nécessite quelques modifications.

4 « J'aime »

Merci pour votre révision, j’ai mis à jour cette PR

3 « J'aime »

Génial ! Cela a été approuvé et fusionné.
Le changement devrait être bientôt sur meta.

5 « J'aime »

Ce sujet a été automatiquement fermé après 3 jours. Les nouvelles réponses ne sont plus autorisées.