2011-10-11 8 views
11

Pracuję nad funkcjonalnością, w której muszę wyzwolić pocztę do listy użytkowników po pomyślnym zaktualizowaniu wartości pola rekordu.Railsy - ActiveRecord - Wyzwalanie poczty przy zmianie wartości pola

Dla np .: Mam model bloga, który opublikował atrybut (reprezentuje kolumnę w mojej tabeli bazy danych) z wartością domyślną jako false. Gdy użytkownik opublikuje bloga, wartość pola stanie się prawdziwa i muszę wysłać kilka wiadomości.

  1. Jaki jest najlepszy sposób na zrobienie tego?
  2. Jeśli mogę używać wywołania zwrotnego after_update, w jaki sposób mogę się dowiedzieć, że opublikowana kolumna została zaktualizowana podczas ostatniego wywołania aktualizacji?
  3. Czy istnieje sposób na uzyskanie dostępu do starej wartości opublikowanego atrybutu po aktualizacji?

Każda pomoc jest bardzo ceniona ...

Odpowiedz

27

1) może być nieco subiektywne, ale ja odpowiem, że wraz z 2) ActiveRecord zapewnia sposoby, aby wskazać, czy atrybut został zmieniony. Możesz użyć nazwy atrybutu + _changed?. Na przykład. Jeśli model posiada atrybut name, to będzie to również odpowiedzi na #name_changed? Oto jeden sposób można wysyłać wiadomości e-mail tylko wtedy, gdy atrybut został zmieniony:

class MyModel 
    after_update :send_email, :if => :column_name_changed? 

    def send_email 
    # Send email here 
    end 
end 

3) Stary wartość atrybutu można uzyskać przez dołączenie _was . Na przykład. #name_was zwróci starą wartość pola nazwy.

UPDATE:

wysłać e-mail tylko za pierwszym razem, że pole jest przełączany z false na true trzeba będzie dodać kolejne pole do bazy danych, takich jak email_sent. Ponieważ stan wywołania zwrotnego send_email stał się bardziej złożony, przeniosłem go do samego wywołania zwrotnego. Po wysłaniu wiadomości e-mail ustaw pole "email_sent" na wartość "prawda", aby nie były wysyłane kolejne wiadomości e-mail.

class MyModel 
    after_update :send_email 

    def send_email 
    if column_name_changed? && !email_sent? 
     # Send email here 
     update_attribute :email_sent, true 
    end 
    end 
end 
+0

Dzięki za szybką odpowiedź. Czy istnieje sposób wyzwalania poczty tylko raz (wartość pola pierwszego po raz pierwszy zmienia się z false na true)? – nkm

+0

Oczywiście, zaktualizowałem swoją odpowiedź, aby wysłać wiadomość e-mail tylko raz. –

+0

Czy nie pojawi się w nieskończonej pętli, jeśli dasz aktualizację ponownie w bloku. –

Powiązane problemy