2011-06-29 6 views
10

Próbuję opóźnić wysłanie wiadomości e-mail z powiadomieniem do użytkowników po zarejestrowaniu się w mojej aplikacji. E-maile są wysyłane za pomocą ActionMailer, którą nazywam InitMailer. Sposób, w jaki próbuję opóźnić pracę, polega na użyciu delayed_job collectiveidei https://github.com/collectiveidea/delayed_job. Aby to zrobić, można zobaczyć, że mogę określić handle_asynchronously po zdefiniowaniu metody initial_email:Jak korzystać z delayed_job, aby Rails 3.0 ActionMailer działał asynchronicznie? Napotkanie ArgumentErrors

class InitMailer < ActionMailer::Base 
    default :from => "[email protected]" 

    def initial_email(user) 
    @user = user 
    @url = "http://www.blahblahblah.com" 
    mail(:to => user.email, 
     :subject => "Welcome to my website!" 
     ) 
    end 

    handle_asynchronously :initial_email 
end 

Jednak wystąpienia błędu argument w moim pliku dziennika "delayed_job.log":

Class#initial_email failed with ArgumentError: wrong number of arguments (1 for 0) - 5 
failed attempts 

Dla twojej informacji, e-mail wysłany w kontrolerze przy użyciu linii:

@user = InitUser.new(params[:init_user]) 
InitMailer.delay.initial_email(@user) 

Dodatkowo, po skonfigurowaniu kodu bez opóźnień, e-maile w wysłano bez problemu (z wyjątkiem tego, że spowolniło to moją aplikację oczekującą na serwery Gmaila)

Gdzie powoduje błędy tutaj? Jak mogę poprawnie wysłać przesyłkę z opóźnieniem?

Odpowiedz

10

Ze względu na sposób, w jaki Rails3 implementuje programy pocztowe, istnieje kilka nietypowych obejść dla delayed_jobs. Na przykład, trzeba zauważyć, że aby opóźnić wysyłkę, piszesz

ExampleMailer.delay.example(user) 

Choć zazwyczaj trzeba by napisać handle_asynchronously po definicji metody, w przypadku koperty tej deklaracji (z jakiegoś powodu) zapobiega opóźnionego zadania z pracy.

Więc w tym kodzie, spadek deklaracji w całości:

class InitMailer < ActionMailer::Base 
    default :from => "[email protected]" 

    def initial_email(user) 
    @user = user 
    @url = "http://www.blahblahblah.com" 
    mail(:to => user.email, 
      :subject => "Welcome to my website!" 
     ) 
    end 

    #No handle_asynchronously needed here 
end 
+0

Dziękujemy! To jest odpowiedź na moje kłopoty. Chciałbym, żebyśmy pracowali z kimś takim jak ty! – geb2011

+0

Awesome. Właśnie zmarnowałem 2 dni próbując to zrozumieć (również był problem z przechwytywaczem powodującym awarię, a Gmail nie chciał akceptować wiadomości e-mail z mojego środowiska programistycznego). – Clay

+0

Używam Mandrill do wysyłania e-maili zamiast Gmaila, nawet w środowisku programistycznym. – Dean

Powiązane problemy