delayed_job:NoMethodError

时间:2011-10-25 07:56:44

标签: ruby-on-rails delayed-job

这是我的小Rails3控制器:

class HomeController < ApplicationController
  def index
    HomeController.delay.do_stuff
  end
  def self.do_stuff
    puts "Hello"
  end
end

访问index后,作业将正确插入数据库中:

--- !ruby/struct:Delayed::PerformableMethod 
object: !ruby/object:Class HomeController
method_name: :do_stuff

问题:执行bundle exec rake jobs:work时,我得到:

Class#do_stuff failed with NoMethodError:
    undefined method `do_stuff' for #<Class:0x0000000465f910>

尽管HomeController.do_stuff完美无缺。有什么想法吗?

3 个答案:

答案 0 :(得分:2)

请参阅文档中的https://github.com/collectiveidea/delayed_job/wiki/Common-problems#wiki-undefined_method_xxx_for_class

好像你应该

..object: !ruby/class HomeController method_name ...

在数据库中,但你有

..object: !ruby/object:Class HomeController method_name ...

代替。这很糟糕。

即使是delayed_job作者也不知道原因。它以某种方式取决于您运行的网络服务器。试试维基的推荐。

答案 1 :(得分:0)

我遇到了同样的问题。

我发现了几个讨论,说明当Web作业将作业放入队列时以及稍后执行时,会使用不同的yaml解析器。

有人建议应该使用心理解析器。有人建议syck。首先,我尝试了心理,但结果与其他宝石的不兼容问题。所以我选择了syck。

我无法理清Web服务器和队列使用的配置文件。经过大量的实验,我最终得到了以下配置(所有这些都在文件的顶部):

#application.rb
require File.expand_path('../boot', __FILE__)

require 'rails/all'
require 'yaml'
YAML::ENGINE.yamler= 'syck'
# ...

#environment.rb
require 'yaml'
YAML::ENGINE.yamler= 'syck'
# ...

#boot.rb
require 'yaml' 
YAML::ENGINE.yamler= 'syck' 
require 'rubygems'
# ...

我正在使用Ruby 1.9.3,Rails 3.2.8,Webrick,delayed_job 3.0.3

答案 2 :(得分:0)

我的情况我的问题主要是因为我将Hash作为参数传递给传递给delayed_job队列的对象。 但是在25条路径之后,我得出结论,delayed_job只接受带有整数作为参数的对象。因此,我将所有参数存储在数据库中,然后将该记录id作为参数传递给delayed_job,在perform函数中,我们可以访问具有该记录id的所有参数,并在获取该数据后删除该记录。

Delayed::Job.enqueue LeadsJob.new(params[:customer]) # this job will be queued but will never run, this is because of the way Delayed_job serializes and De-serializes the objects.

而是做这样的事情

@customer = Customer.create(params[:customer])
Delayed::Job.enqueue LeadsJob.new(@customer.id)

如果客户详细信息只是传递参数,则删除该函数内的该记录。

如果您需要更多详细信息,请告诉我。

问题也可能是因为Delayed_Job使用的YAML解析器,但我还没有尝试过@Stefan Pettersson提到的那个选项