所以我使用延迟工作,我试图找出如何让我的所有邮件延迟。现在,我已将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
- 这样他们就可以立即调用整个事物。
答案 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
调用那样做愚蠢的事情。