Wysyłam wiadmości email w tle przy użyciu Resque + Resque::Mailer
ClientMailer.welcome(client.id).deliver
def welcome(client_id)
@client = Client.find client_id
mail({
:to => @client.email,
:subject => 'Witaj!'
})
end
Czasami przy długiej kolejce obiekt klient już nie istnieje w bazie danych gdy worker próbuje wykonać zadanie
Jak to przerobić aby w przypadku braku klienta mail nie został wysłany
Coś na tą nutę.
def welcome(client_id)
if @client = Client.find_by_id client_id
mail({
:to => @client.email,
:subject => 'Witaj!'
})
else
??????
end
end
miałem podobny problem w jednym projekcie i okazało się że nie da się powstrzymać mailera przed wywołaniem metody deliver. Rozwiązałem to w ten sposób:
class MockMail < Mail::Message
def deliver
false
end
end
i w mailerze
#some monkey patching to prevent email to be sent (or more precisely to mock mail)
def initialize(method_name=nil, *args)
@_message = MockMail.new if some_condition_that_prevents_email_to_be_send
end