我正在努力学习如何在我的rails 3 + heroku app上使用delayed_job。
我目前有以下哪些电子邮件发送请求(不是延迟工作),但它有效!
UserMailer.conversation_notification(record.commentable, participant, record, @comments).deliver
我更新了这个以开始使用delayed_job:
Delayed::Job.enqueue UserMailer.conversation_notification(record.commentable, participant, record, @comments).deliver
但是这个错误:“ArgumentError(无法排列不响应执行的项目):”
我也尝试过:
UserMailer.delay.conversation_notification(record.commentable, participant, record, @comments)
但是错误的是:
NoMethodError (undefined method `delay' for UserMailer:Class):
任何delayed_job大师在那里?感谢
答案 0 :(得分:6)
来自文档https://github.com/collectiveidea/delayed_job
您的第二种方法是正确的,它删除了.deliver
方法:
UserMailer.delay.conversation_notification(record.commentable, participant, record, @comments)
如果你得到一个未定义的方法delay
你是否将DelayedJob添加到Gemfile中?
gem "delayed_job"
由于包含delayed_job会将“延迟”方法添加到所有内容中。
答案 1 :(得分:2)
我使用延迟的结果好坏参半,我发现调试非常具有挑战性。所以你并不孤单!但是当你开始工作时,它是值得的。
我已经学会了在调用延迟之前保存我的对象。通常我会从after_save回调中触发我的工作。
作为一项实验,有一段时间我使用了不同的模式。我为每个工作创建了一个工作对象。例如,我会打电话给
Delayed::Job.enqueue(PersonJob.new(@person.id))
在我的项目的其他地方,我将创建工作对象。在Rails 2中,我将它们放在lib /中如果你使用rails 3,你需要改变application.rb config.autload_path
class PersonJob < Struct.new(:person_id)
def perform
person = Person.find(person_id)
#do work
end
end
config.autoload_paths += Dir["#{config.root}/lib/**/"]
答案 2 :(得分:1)
我刚看了一下文档,已经有一段时间了,因为我实际上使用了delayed_job ......
作业是Ruby对象,其方法名为perform
,因此您需要将一个对象排入队列
UserMailer.conversation_notification(record.commentable, participant, record, @comments).deliver
在perform
方法中。
或者,您可以使用send_later
:
UserMailer.conversation_notification(record.commentable, participant, record, @comments).send_later(:deliver)