我正在尝试在更改电子邮件地址时发送电子邮件通知。要做到这一点,我需要首先检测属性是否实际更改。我认为添加代码的最佳位置是控制器中的after_filter
。
# 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)是否有比上述方法更好的方法?
答案 0 :(得分:0)
您可能想要实现的是ActiveRecord :: Observer
http://api.rubyonrails.org/v3.2.0/classes/ActiveRecord/Observer.html
这是专为您的要求设计的......一个类,它对原始类的更改执行类似触发器的行为,但在类之外。
非常容易设置和使用!