Ich arbeite an einem Plugin, das Benutzer einer Gruppe hinzufügt, wenn ihre E-Mail-Adresse auf einer Whitelist steht.
Es funktioniert bereits für neue Benutzer mit:
DiscourseEvent.on(:user_created) do |user|
GroupDomain.add_to_group_if_in_whitelisted_domain(user)
end
Als Nächstes möchte ich, dass Benutzer automatisch in die Gruppe verschoben werden, wenn sie ihre Adresse auf eine passende Domain ändern. Ich dachte, folgender Code würde funktionieren:
DiscourseEvent.on(:user_updated) do |user|
GroupDomain.add_to_group_if_in_whitelisted_domain(user)
end
aber das tut er nicht. (Ich dachte dann, es würde funktionieren, wenn sie ihre E-Mail-Adresse ändern und danach noch etwas anderes im Benutzerdatensatz ändern – und das funktioniert tatsächlich!)
Gibt es ein Event, das ich aufrufen oder überwachen kann (ich bin nur ein Höhlenmensch), das feuert, wenn sich ihre E-Mail-Adresse ändert?
Je mehr ich darüber nachdenke, desto mehr scheint es mir ein Fehler zu sein, dass :user_updated nicht ausgelöst wird, wenn eine E-Mail-Adresse geändert wird. Vor der Einführung des user_email-Modells wurde :user_updated bei einer Änderung der E-Mail-Adresse ausgelöst.
Aber wenn UserEmail so definiert ist:
do
after_update :trigger_user_updated_event
und mit
def trigger_user_updated_event
user = User.find(self.user_id)
DiscourseEvent.trigger(:user_updated, user)
true
end
wird es öfter ausgelöst als es sollte (z. B. beim Einloggen über einen E-Mail-Link) und verursacht zudem einen Fehler:
PG::UniqueViolation - ERROR: duplicate key value violates unique constraint "index_group_users_on_group_id_and_user_id"
Für ein paar Minuten dachte ich, ich wüsste, was los ist.
Es liegt nicht daran, dass es sich um ein anderes Modell handelt, wie du herausgefunden hast. Seit die Änderungen von @LeoMcA übernommen wurden, sind User und UserEmail separate Modelle, und das Ändern einer Instanz von UserEmail löst keinen Watcher in einer User-Instanz aus.
self.add_model_callback(UserEmail, :after_commit, on: :update) do
puts "#{'-'*50}\nEMAIL JA ADRESSE WURDE AKTUALISIERT für #{self.user_id}!!!!\n#{'-'*50}\n"
user = User.find(self.user_id)
GroupDomain.add_to_group_if_in_whitelisted_domain(user)
end