如何检查属性更改并在rails中触发回调

问题描述:

我试图在电子邮件地址更改时发送电子邮件通知。要做到这一点,我需要首先检测属性是否真的改变。我认为添加代码的最佳位置是在控制器中的after_filter如何检查属性更改并在rails中触发回调

# app/controllers/users_controller.rb 
after_filter :email_change_notification, only: [:update] 

def email_change_notification 
    UserMailer.notify_new_email if @user.email_changed? 
end 

我现在的问题是,电子邮件email_changed?不会在此上下文中返回预期值。它始终是false。作为替代方案,我能做到这一点的模型after_save

# app/models/user.rb 
after_save :email_change_notification 

def email_change_notification 
    UserMailer.notify_new_email if email_changed? 
end 

这工作,但我认为前者是一个更好的方法,因为调用邮件是不是模型的责任的一部分。

我的问题是:

(1)我应该在哪里把这样的回调(模型或控制器)?

(2)有没有更好的方法来使控制器的方法工作?

(3)有没有比提到的更好的方法?

你可能想实现是一个ActiveRecord ::观察员

http://api.rubyonrails.org/v3.2.0/classes/ActiveRecord/Observer.html

这样的设计正是为您requiements ......执行类似触发的水煤浆上改变原来的类的类,但在课外。

非常容易设置和使用!