Есть ли способ создать наблюдателя на одном поле? - PullRequest
0 голосов
/ 06 января 2012

обновление, в конце концов, решение было перенести это на модель пользователя вместо профиля. Обратите внимание, что в профиле я должен проверить obj.owner.email. Похоже, что к моменту достижения профиля obj.owner (пользователь) уже был сохранен и ни одно из условий не было выполнено. Это работает в другой модели.

я хотел бы ограничить количество отправляемых писем, когда поле электронной почты в таблице пользователей меняется с пустого на действительное. Я пробовал пару методов обратного вызова, но они вызывают некоторые проблемы .

Я не нашел слишком много информации о наблюдателях. Я знаю, что вы можете использовать все методы обратного вызова, но есть ли возможность проверить одно поле?

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

Я использовал перед сохранением, потому что мое понимание изменилось? всегда будет ложным, если after_save или after_commit. Я ошибаюсь?

На мгновение я подумал, что это может быть часть after_transaction - но сообщение журнала даже не записывается в файл журнала.

Ответы [ 2 ]

1 голос
/ 07 января 2012

Попробуйте:

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

def foo
 #whatever you need
end
0 голосов
/ 07 января 2012

вы можете захотеть взглянуть на acts_as_versioned (https://github.com/technoweenie/acts_as_versioned) или acts_as_audited (https://github.com/collectiveidea/acts_as_audited)), таким образом, вы знаете предыдущий адрес электронной почты и решите, отправлять электронную почту или нет в коде наблюдателя.

...