Rails 3 - Delayed_Job

时间:2010-12-11 06:24:47

标签: ruby-on-rails ruby-on-rails-3 delayed-job

我正在努力学习如何在我的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大师在那里?感谢

3 个答案:

答案 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)