プラグイン開発:メールアドレスが変更された場合にイベントが発火するか?

ホワイトリストに登録されたメールアドレスを持つユーザーをグループに追加するプラグインの開発を進めています。

新規ユーザーについては、以下のように動作しています。

  DiscourseEvent.on(:user_created) do |user|
    GroupDomain.add_to_group_if_in_whitelisted_domain(user)
  end

次にやりたいのは、ユーザーがメールアドレスをホワイトリストに登録されたドメインに変更した場合に、そのユーザーをグループに移動させることです。以下のようにすればできると考えたのですが、うまくいきません。

  DiscourseEvent.on(:user_updated) do |user|
    GroupDomain.add_to_group_if_in_whitelisted_domain(user)
  end

(その後、ユーザーがメールアドレスを変更した後に、ユーザーレコードの他の項目も変更すれば動作することを確認しました!)

メールアドレスが変更されたときに発火するイベントはありますか?(私は初心者なので、呼び出せるか監視できるイベントがあれば教えてください。)

考えてみると、メールアドレスが変更されたときに :user_updated がトリガーされないのはバグのように思えてきます。以前、user_email モデルが存在する前は、メールアドレスの変更で :user_updated がトリガーされていました。

しかし、UserEmail に以下のように記述すると、

  do

    after_update :trigger_user_updated_event

さらに以下のメソッド

  def trigger_user_updated_event
    user = User.find(self.user_id)
    DiscourseEvent.trigger(:user_updated, user)
    true
  end

を定義すると、必要以上に頻繁にトリガーされてしまいます(例えば、メールリンク経由でログインしたときなど)。また、以下のようなエラーも発生します。

PG::UniqueViolation - ERROR:  duplicate key value violates unique constraint "index_group_users_on_group_id_and_user_id"

数分間、自分が何かを知っていると思い込んでいました。:crying_cat_face:

異なるモデルだからというわけではありません。あなたが気づいた通り、@LeoMcA の変更がマージされて以降、User と UserEmail は別々のモデルとなっています。そのため、UserEmail のインスタンスを変更しても、User のインスタンスのウォッチャーはトリガーされません。

メールアドレスが変更されたときに、conditionally_add_to_group 関数が呼び出される最適な方法を教えていただけますか?

plugin.rb に以下のような記述で対応できると思います

after_initialize do

  add_model_callback(UserEmail, :after_commit, on: :update) do
     # Group.add などの処理
  end

end

やった!IT が動作しました!

  self.add_model_callback(UserEmail, :after_commit, on: :update) do
    puts "#{'-'*50}\nEMAIL YES ADDRESS IS UPDATED for #{self.user_id}!!!!\n#{'-'*50}\n"
    user = User.find(self.user_id)
    GroupDomain.add_to_group_if_in_whitelisted_domain(user)
  end

@Falco さん、本当にありがとうございます!