有没有办法在单个字段上创建观察者?

时间:2012-01-06 18:56:33

标签: ruby-on-rails ruby-on-rails-3 observer-pattern

更新,最后,解决方案是将其移动到用户模型而不是配置文件。请注意,在个人资料中,我必须检查obj.owner.email。似乎到达配置文件时,obj.owner(用户)已经保存,并且没有任何条件通过。 这适用于其他模型。

我想要做的是限制当users表中的电子邮件字段从空白到有效电子邮件时发送电子邮件的次数。我尝试了几种回调方法,但那些是causing some problems

我没有在观察员身上找到太多信息。我知道你可以在那里做所有的回调方法,但无论如何要检查一个字段吗?

profile.rb:

  before_save :send_messages_after_registration!, :if => lambda {|obj| obj.owner.email_changed? && (obj.owner.email_was.nil? || obj.owner.email_was.blank?) }


  def send_messages_after_registration!
    Rails.logger.debug("Entered send_messages_after_registration! with email : " + self.owner.email.to_s)
    after_transaction do
      unless self.owner.email.blank?
        Rails.logger.debug("email.blank? is false with email : " + self.owner.email.to_s)
        JobSeekerNotifier.webinar_notification(self.owner.id).deliver
        Resque.enqueue_in(48.hours, TrackReminderWorker, self.owner.id)
      end
    end
  end

我之前使用过保存,因为我的理解是.changed?如果after_save或after_commit,将始终为false。我错了吗?

我认为它可能是after_transaction部分 - 但日志消息甚至没有写入日志文件。

2 个答案:

答案 0 :(得分:1)

尝试:

before_save :foo, :if => lambda {|obj| obj.field_name_changed? && obj.field_name == true }

def foo
 #whatever you need
end

答案 1 :(得分:0)

你可能想看看acts_as_versioned(https://github.com/technoweenie/acts_as_versioned)或acts_as_audited(https://github.com/collectiveidea/acts_as_audited)这样你知道以前的电子邮件地址,并决定是否用观察者代码发送电子邮件。