pfaffman
(Jay Pfaffman)
2019 年 7 月 24 日午後 11:06
1
ホワイトリストに登録されたメールアドレスを持つユーザーをグループに追加するプラグインの開発を進めています。
新規ユーザーについては、以下のように動作しています。
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
(その後、ユーザーがメールアドレスを変更した後に、ユーザーレコードの他の項目も変更すれば動作することを確認しました!)
メールアドレスが変更されたときに発火するイベントはありますか?(私は初心者なので、呼び出せるか監視できるイベントがあれば教えてください。)
pfaffman
(Jay Pfaffman)
2019 年 7 月 25 日午後 6:32
2
考えてみると、メールアドレスが変更されたときに :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"
数分間、自分が何かを知っていると思い込んでいました。
Falco
(Falco)
2019 年 7 月 25 日午後 6:39
3
異なるモデルだからというわけではありません。あなたが気づいた通り、@LeoMcA の変更がマージされて以降、User と UserEmail は別々のモデルとなっています。そのため、UserEmail のインスタンスを変更しても、User のインスタンスのウォッチャーはトリガーされません。
pfaffman
(Jay Pfaffman)
2019 年 7 月 25 日午後 6:42
4
メールアドレスが変更されたときに、conditionally_add_to_group 関数が呼び出される最適な方法を教えていただけますか?
Falco
(Falco)
2019 年 7 月 25 日午後 6:54
5
plugin.rb に以下のような記述で対応できると思います
after_initialize do
add_model_callback(UserEmail, :after_commit, on: :update) do
# Group.add などの処理
end
end
pfaffman
(Jay Pfaffman)
2019 年 7 月 25 日午後 7:19
6
やった!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 さん、本当にありがとうございます!