Quello ha risolto l’errore. Immagino che, non riuscendo a trovare la Classe in precedenza, la stesse trattando come una Constant? In ogni caso, il problema è risolto, ottimo, grazie mille! Sono sbloccato!
Quindi il motivo per cui avevo questo:
user.approved = true
user.approved_by_id = Discourse.system_user.id
prima di:
reviewable.perform(:approve, Discourse.system_user)
è che l’aggiunta alla coda di revisione è asincrona. Nel job, la revisione viene creata solo se approve è falso da (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
}
)
C’è il rischio che il job venga eseguito dopo che hai già verificato l’esistenza della voce di revisione?
Il risultato è che la voce di revisione sembra non esistere, ma il job è semplicemente in attesa di essere eseguito. Il job viene poi eseguito e crea la voce di revisione, e tu hai perso l’opportunità di eliminarla perché il tuo codice di test è già stato eseguito.
È una potenziale condizione di gara?
Imposta approved su true prima di verificare l’esistenza di una voce di revisione e avrai risolto il problema (poiché una revisione non verrà mai creata dopo questo, in quanto è una dipendenza).
Ho incontrato questo problema testando il mio codice: in dev funzionava, ma in produzione ha fallito perché le cose venivano eseguite in un ordine diverso.
NB: Apprezzo che tu non abbia scritto questo per supportare questo caso d’uso, ma ritengo importante permettere ai plugin di poter approvare automaticamente i nuovi utenti in circostanze speciali (ad esempio, come fa il plugin di Discord, che lo fa se l’utente è membro di una gilda affidabile).