这是我的小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
完美无缺。有什么想法吗?
答案 0 :(得分:2)
好像你应该
..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提到的那个选项