Das hat den Fehler behoben. Ich nehme an, da die Klasse zuvor nicht gefunden werden konnte, wurde sie als Konstante behandelt? Auf jeden Fall ist das Problem gelöst, großartig, vielen Dank! Ich bin wieder auf dem Damm!
Der Grund, warum ich dies:
user.approved = true
user.approved_by_id = Discourse.system_user.id
vor:
reviewable.perform(:approve, Discourse.system_user)
hatte, liegt daran, dass der Eintrag in die Warteschlange für Überprüfungen asynchron erfolgt. Im Job wird die Überprüfung nur erstellt, wenn approve falsch ist (siehe 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
}
)
Besteht nicht die Gefahr, dass der Job nachdem Sie den Eintrag in der Warteschlange geprüft haben, ausgeführt wird?
Das Ergebnis ist, dass der Eintrag in der Warteschlange anscheinend nicht existiert, aber der Job nur darauf wartet, ausgeführt zu werden. Der Job wird dann ausgeführt und erstellt den Eintrag, und Sie haben die Gelegenheit verpasst, ihn zu löschen, da Ihr Code zur Prüfung bereits ausgeführt wurde.
Ist das nicht eine potenzielle Race Condition?
Stellen Sie approved auf true, bevor Sie nach einem Eintrag in der Warteschlange suchen, und Sie haben das Problem gelöst (da nach diesem Zeitpunkt niemals eine Überprüfung erstellt wird, da dies eine Abhängigkeit darstellt).
Ich bin auf dieses Problem gestoßen, als ich meinen Code getestet habe – lokal hat es funktioniert, aber in der Produktion fehlgeschlagen, da die Dinge in einer anderen Reihenfolge abgelaufen sind.
Anmerkung: Ich weiß zu schätzen, dass Sie dies nicht für diesen Anwendungsfall geschrieben haben, aber ich halte es für wichtig, dass Plugins neue Benutzer unter besonderen Umständen automatisch genehmigen können (z. B. wie das Discord-Plugin, das dies tut, wenn der Benutzer Mitglied einer vertrauenswürdigen Gilde ist).