Résumé
Dans la file d’attente de révision (/review), si un modérateur modifie les étiquettes (tags) d’une publication en attente, puis clique sur Approuver, la demande d’approbation échoue avec une Erreur interne du serveur 500.
Étapes pour Reproduire
- Assurez-vous qu’une publication est en attente dans la file d’attente de révision (par exemple, d’un utilisateur/groupe nécessitant une approbation).
- Allez à
/review. - Ouvrez l’élément en file d’attente.
- Modifiez les étiquettes à l’aide de l’interface utilisateur du sélecteur d’étiquettes.
- Cliquez sur Approuver.
- Observez une réponse 500.
Comportement Attendu
La publication doit être approuvée avec succès, les étiquettes mises à jour étant appliquées.
Comportement Actuel
L’approbation échoue avec une erreur 500.
Modèle de requête d’exemple :
PUT /review/{id}/perform/approve_post?version={x} → 500 (Internal Server Error)
Ce qui semble se passer (Cause Racine)
Après avoir modifié les étiquettes dans l’interface utilisateur de révision, la charge utile (payload) de l’élément révisable stocke des objets d’étiquettes complets au lieu de chaînes de noms d’étiquettes.
Avant de modifier les étiquettes :
payload["tags"] = ["tag-one", "tag-two"]
Après avoir modifié les étiquettes dans /review :
payload["tags"] = [
{"id"=>123, "name"=>"tag-one", "description"=>nil, "count"=>50, ...},
{"id"=>456, "name"=>"tag-two", "description"=>nil, "count"=>30, ...}
]
Lorsque l’action d’approbation traite les étiquettes, elle semble s’attendre à des chaînes, mais reçoit des hachages/objets, ce qui entraîne l’erreur 500.
Solution de Contournement
Normaliser les étiquettes pour revenir aux noms :
r = ReviewableQueuedPost.find(ID)
r.payload["tags"] = r.payload["tags"].map { |t| t.is_a?(Hash) ? t["name"] : t }
r.save!
