【问题标题】:Rails 3 - Delayed_JobRails 3 - Delayed_Job
【发布时间】:2011-05-23 20:45:45
【问题描述】:

我正在努力学习如何在我的 rails 3 + heroku 应用程序上使用 delay_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 (Cannot enqueue items which does not respond to perform):”

我也试过了:

UserMailer.delay.conversation_notification(record.commentable, participant, record, @comments)

但是那个错误是:

NoMethodError (undefined method `delay' for UserMailer:Class):

那里有任何延迟工作大师吗?谢谢

【问题讨论】:

  • 未来的谷歌人首先尝试重启你的服务器

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


【解决方案1】:

来自文档https://github.com/collectiveidea/delayed_job

您的第二种方法是正确的,它删除了.deliver 方法:

UserMailer.delay.conversation_notification(record.commentable, participant, record, @comments)

如果你得到一个未定义的方法 delay 你是否将 DelayedJob 添加到 Gemfile 中?

gem "delayed_job"

由于包含delayed_job 会为所有内容添加“延迟”方法。

【讨论】:

    【解决方案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/**/"]
    

    【讨论】:

      【解决方案3】:

      我刚刚看了一下文档,已经有一段时间没有真正使用delayed_job了...

      作业是具有称为perform 的方法的Ruby 对象,因此您需要将一个对象加入队列

      UserMailer.conversation_notification(record.commentable, participant, record, @comments).deliver
      

      在其perform 方法中。

      或者,您可以使用send_later

      UserMailer.conversation_notification(record.commentable, participant, record, @comments).send_later(:deliver)
      

      【讨论】:

      • 我试过“UserMailer.conversation_notification(record.commentable,participant,record,@cmets).delay.deliver”但是得到“NoMethodError (undefined method `delay' for #<:message:0x10560f0d0>):"
      • 我认为上面引用了错误的文档,对于 rails 3,请参阅:github.com/collectiveidea/delayed_job
      猜你喜欢
      • 2013-07-04
      • 1970-01-01
      • 2012-01-25
      • 2014-11-30
      • 2014-10-30
      • 2013-03-05
      • 1970-01-01
      • 2011-05-29
      • 1970-01-01
      相关资源
      最近更新 更多