Cela a résolu l’erreur. Je suppose que, comme il ne trouvait pas la classe auparavant, il la traitait comme une constante ? En tout cas, c’est résolu, génial, merci beaucoup ! Je suis débloqué !
La raison pour laquelle j’avais ceci :
user.approved = true
user.approved_by_id = Discourse.system_user.id
avant :
reviewable.perform(:approve, Discourse.system_user)
est que l’ajout à la file d’examen est asynchrone. Dans le job, l’examen n’est créé que si approve est faux (discourse/app/jobs/regular/create_user_reviewable.rb at 888e68a1637ca784a7bf51a6bbb524dcf7413b13 · discourse/discourse · GitHub) :
if user = User.find_by(id: args[:user_id])
return if user.approved?
@reviewable = ReviewableUser.needs_review!(
target: user,
created_by: Discourse.system_user,
reviewable_by_moderator: true,
payload: {
username: user.username,
name: user.name,
email: user.email
}
)
Il existe un risque que le job s’exécute après que vous ayez testé l’entrée d’examen ?
Le résultat est que l’entrée d’examen semble ne pas exister, mais le job est simplement en attente d’exécution. Le job s’exécute ensuite et crée l’entrée d’examen, et vous avez manqué l’opportunité de la supprimer car votre code de test a déjà été exécuté.
C’est une condition de course potentielle ?
Définissez approved à true avant de vérifier l’entrée d’examen et vous aurez résolu le problème (car un examen ne sera jamais créé après cela, car c’est une dépendance).
J’ai rencontré ce problème en testant mon code : sur dev, cela fonctionnait, puis en production, cela a échoué car les choses s’exécutaient dans un ordre différent.
NB : J’apprécie que vous n’ayez pas écrit cela pour prendre en charge ce cas d’utilisation, mais je pense qu’il est important de permettre aux plugins de pouvoir approuver automatiquement les nouveaux utilisateurs dans des circonstances spéciales (par exemple, comme le plugin Discord qui le fait si l’utilisateur est membre d’un guildes de confiance).