如何检查属性更改并触发rails

时间:2016-01-13 08:31:33

标签: ruby-on-rails

我正在尝试在更改电子邮件地址时发送电子邮件通知。要做到这一点,我需要首先检测属性是否实际更改。我认为添加代码的最佳位置是控制器中的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)是否有比上述方法更好的方法?

1 个答案:

答案 0 :(得分:0)

您可能想要实现的是ActiveRecord :: Observer

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

这是专为您的要求设计的......一个类,它对原始类的更改执行类似触发器的行为,但在类之外。

非常容易设置和使用!