如何使用delayed_job使Rails 3.0 ActionMailer异步运行?遇到ArgumentErrors

时间:2011-06-29 04:56:25

标签: ruby-on-rails actionmailer delayed-job argument-error

我正在尝试延迟在注册我的应用时发送给用户的通知电子邮件。电子邮件使用ActionMailer发送,我称之为InitMailer。我试图推迟工作的方式是使用collectiveidea的delayed_job https://github.com/collectiveidea/delayed_job。为此,您可以看到我在定义方法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 个答案:

答案 0 :(得分:10)

由于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