我使用delayed_job中的代码示例发送简报:
class NewsletterJob < Struct.new(:subscribers)
def perform
subscribers.each { |subscriber| NewsletterMailer.newsletter(subscriber.id) }
end
end
然后我在这里设置工作:
Delayed::Job.enqueue NewsletterJob.new(Subscriber.find(:all))
如果我不使用延迟工作,邮件会被发送,因此它可以正常工作。 如果我直接使用延迟作业,邮件将按如下方式发送:
NewsletterMailer.delay.newsletter(subscriber)
在数据库的jobs表中,以下是yaml:
--- !ruby/struct:NewsletterJob
subscribers:
- !ruby/ActiveRecord:Subscriber
attributes:
id: '54'
email: someemail@gmail.com
created_at: '2013-08-09 04:44:51.113258'
updated_at: '2013-08-09 08:26:05.934564'
token: quVI0dhxyyentB7TJ1IO6w
- !ruby/ActiveRecord:Subscriber
attributes:
id: '56'
email: another@gmail.com
created_at: '2013-08-11 09:29:22.000829'
updated_at: '2013-08-11 09:29:22.000829'
token: a-n-yijwi38_HvGFSmetmA
我使用MockSMTP在本地计算机上发送电子邮件。
出于某种原因,即使作品似乎处理作业,也不会发送电子邮件。
yaml有问题吗?
任何帮助表示我是NOOB
答案 0 :(得分:2)
在邮件方法前面链接delayed
时,您无需在其上调用deliver
。延迟::约会为你照顾。
NewsletterMailer.delay.newsletter(subscriber) # No need to call `deliver` here
但是当你从自己的自定义作业结构中调用它时,你需要记住调用邮件程序的deliver
方法:
subscribers.each do |subscriber|
NewsletterMailer.newsletter(subscriber.id).deliver # You need `deliver` here
end
答案 1 :(得分:0)
最后,我需要使用camel case命名作业类并将其放在lib目录中。
#lib
NewsletterJob.rb
然后在#application.rb中,我不得不关闭自动删除失败的作业以查看发生了什么,并从lib中预加载文件
Delayed::Worker.destroy_failed_jobs = false
require "#{Rails.root.to_s}/lib/NewsletterJob.rb"
这一切都基于这里的答案 Delayed_job not executing the perform method but emptying the job queue