Delayed_Job - 与ActionMailer handle_asynchronously?

时间:2011-05-22 04:37:39

标签: ruby-on-rails delayed-job

所以我使用延迟工作,我试图找出如何让我的所有邮件延迟。现在,我已将handle_asynchronously放在我的所有动作邮件方法上......但我认为这不会起作用。

def first_notification(time)
  @time = time
  mail :to => time.person.email,
       :from => "email@example.com",
       :subject => "#{time.person.name} wants to say hi"
end
handle_asynchronously :advisor_first_notification, :priority => 20

我不认为这会起作用的原因是因为我这样说:

UserMailer.first_notification(@time).deliver

那么它将如何处理.deliver部分呢?现在我得到一个例外。

EXCEPTION: #<ArgumentError: wrong number of arguments (1 for 0)>

这让我觉得在交付方面有些事情搞砸了。

我宁愿每个电子邮件都没有单独的作业文件(因为我有很多电子邮件),那么处理这个问题的正确方法是什么?

我能想到的唯一另一个选择是将调用封装到我的模型中的方法中并让它们具有handle_asynchronously - 这样他们就可以立即调用整个事物。

3 个答案:

答案 0 :(得分:10)

邮件程序有点棘手......而不是使用handle_asynchronously语法:

UserMailer.delay.first_notification(@time)

'技巧'在邮件程序方法之前有delay()

答案 1 :(得分:4)

除了Jesse的回答之外,collectiveidea's fork of delayed_job表示你绝对应该使用Rails 3 Mailer代码的传递方法:

# without delayed_job
Notifier.signup(@user).deliver
# with delayed_job
Notifier.delay.signup(@user)

答案 2 :(得分:0)

我通过以下方式让它工作:

class MyMailer < ActionMailer::Base
  def send_my_mail_method(*args)
    MyMailer.my_mail_method(*args).deliver
  end
  handle_asynchronously :send_my_mail_method

  def my_mail_method(*args)
    # mail call ...
  end
end

我喜欢这种方式,因为它允许我测试交付是否以交互方式进行,而不必像嘲笑delay调用那样做愚蠢的事情。