Как использовать delayed_job, чтобы заставить Rails 3.0 ActionMailer работать асинхронно?Обнаружение ArgumentErrors - PullRequest
10 голосов
/ 29 июня 2011

Я пытаюсь отложить отправку уведомления по электронной почте пользователям после регистрации в моем приложении. Письма отправляются с использованием ActionMailer, который я называю InitMailer. Способ, которым я пытаюсь отложить работу, - это использование delayed_job https://github.com/collectiveidea/delayed_job. Collectidea. Для этого вы можете видеть, что я определяю handle_asynchronously после определения метода initial_email:

class InitMailer < ActionMailer::Base
  default :from => "info@blahblahblah.com"

  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

Тем не менее, я столкнулся с ошибкой аргумента в моем файле журнала "delayed_job.log":

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

Для вашей информации, электронное письмо отправляется на контроллер через строку:

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

Кроме того, когда я настраивал свой код без задержки, электронные письма отправлялись без проблем (за исключением того факта, что это замедляло мое приложение в ожидании серверов Gmail)

Где здесь ошибки? Как получить задержанную почту для правильной отправки?

1 Ответ

10 голосов
/ 05 июля 2011

Из-за того, что Rails3 реализует почтовые программы, есть некоторые необычные обходные пути для delayed_jobs.Например, вы видели, что для того, чтобы отложить рассылку, вы пишете

 ExampleMailer.delay.example(user)

В то время как обычно вам придется писать handle_asynchronously после определения метода, в случае почтовых программ это объявление (по некоторым причинам)запрещает выполнение этой отложенной работы.

Итак, в этом коде полностью удалите объявление:

 class InitMailer < ActionMailer::Base
   default :from => "info@blahblahblah.com"

   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
...