Delayed_job(2.1.4)错误:作业无法加载:需要IO实例。 处理者无

我创建了一个简单的成就系统,并想引入delayed_job(2.1.4)来处理。 但是,delayed_jobs表中的处理程序列始终为nil,这会导致last_error文本: Job failed to load: instance of IO needed. Handler nil Job failed to load: instance of IO needed. Handler nil

这是我的设置:

成就观察员

 class AchievementObserver < ActiveRecord::Observer observe User, Comment, ... def after_create(record) # initiate delayed job to check conditions Delayed::Job.enqueue(TrophyJob.new(record.id, record.class.name)) end ... end 

奖杯工作

 class TrophyJob < Struct.new(:record_id, :record_type) def perform case record_type when "User" UserProfileCompleteTrophy.progress(User.find(record_id)) # complete your profile settings NewsletterReceiverTrophy.progress(User.find(record_id)) # sign up for the newsletter when "Comment" CommentsAuthoredTrophy.progress(Comment.find(record_id)) # create x comments ... end end end 

将创建delayed_jobs表中的条目。 但是,处理程序始终为NULL。 我已经尝试了各种各样的东西(之前通过完整的对象,现在转到id + classname,如下所述:extreme_job 奇怪的exception ;在观察者中尝试了xxxTrophy.delay.progress(…);等等 – 所有没有运气。

我也有

 require 'yaml' YAML::ENGINE.yamler= 'syck' 

在我的boot.rb.

值得一提的是:虽然last_error文本由delayed_job填充,但尝试和failed_at列仍为NULL。

我错过了什么?

UPDATE

我validation序列化的工作正如人们所期望的那样:

 ruby-1.9.2-p290 :004 > TrophyJob.new(1, "User").to_yaml => "--- !ruby/struct:TrophyJob \nrecord_id: 1\nrecord_type: User\n" 

找到解决方案:我的问题是由质量分配保护引起的。 我有一个初始化程序来防止批量分配:

 # SECURITY: protect against mass assignment vulnerabilities # enforces explicitly setting attributes accessible in models (whitelisting) ActiveRecord::Base.send(:attr_accessible, nil) 

这阻止了delayed_job访问处理程序字段! 不确定这是否可以被视为DJ中的错误。 这是解决我的问题的初始化代码:

 # Imortant: delayed job requires some attributes to be accessible - make sure they are Delayed::Job.attr_accessible :priority, :payload_object, :handler, :run_at, :failed_at 

您的处理程序列可能太小而无法放入其中。 您可以在迁移中修复此问题,如下所示:

 change_column :delayed_jobs, :handler, :text, :limit => 64.kilobytes + 1