Ruby on rails 延迟的_作业(2.1.4)错误:无法加载作业:需要IO实例。处理器零

Ruby on rails 延迟的_作业(2.1.4)错误:无法加载作业:需要IO实例。处理器零,ruby-on-rails,ruby-on-rails-3.1,delayed-job,mass-assignment,Ruby On Rails,Ruby On Rails 3.1,Delayed Job,Mass Assignment,我创建了一个过于简单的成就系统,并希望引入延迟工作(2.1.4)来处理过程。但是,delayed_jobs表中的handler列始终为nil,这导致最后一个_错误文本:Job未能加载:需要IO实例。处理程序nil 以下是我的设置: 成就观察者 class AchievementObserver < ActiveRecord::Observer observe User, Comment, ... def after_create(record) # initiate de

我创建了一个过于简单的成就系统,并希望引入延迟工作(2.1.4)来处理过程。但是,delayed_jobs表中的handler列始终为nil,这导致最后一个_错误文本:
Job未能加载:需要IO实例。处理程序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
在我的靴子里

值得一提的是:尽管上一个\u错误文本由延迟的\u作业填充,但尝试和失败的\u列仍然为空

我错过了什么

更新

我验证了序列化的工作原理与预期一致:

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

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

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

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

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

找到了解决方案:我的问题是由批量分配保护引起的。我有一个初始值设定项来防止质量分配:

# SECURITY: protect against mass assignment vulnerabilities
# enforces explicitly setting attributes accessible in models (whitelisting)
ActiveRecord::Base.send(:attr_accessible, nil)
这将阻止延迟的\u作业访问处理程序字段!不确定这是否可以被视为DJ中的bug。以下是解决我的问题的初始值设定项代码:

# 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

找到了解决方案:我的问题是由批量分配保护引起的。我有一个初始值设定项来防止质量分配:

# SECURITY: protect against mass assignment vulnerabilities
# enforces explicitly setting attributes accessible in models (whitelisting)
ActiveRecord::Base.send(:attr_accessible, nil)
这将阻止延迟的\u作业访问处理程序字段!不确定这是否可以被视为DJ中的bug。以下是解决我的问题的初始值设定项代码:

# 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

您是否尝试过删除yaml引擎自定义项(或者这是可能的)?这一行是yaml工作所必需的(例如,对于我的地区)。我提到它只是为了表明我认为问题可能是由YAML序列化问题引起的,但我发现这不太可能。谢谢。您是否尝试过删除yaml引擎自定义项(或者这是否可能)?这一行是yaml工作所必需的(例如,对于我的地区)。我提到它只是为了表明我认为问题可能是由YAML序列化问题引起的,但我发现这不太可能。谢谢,谢谢你的提示。我试过了,但运气不好。因为我只存储ID和classname,所以我认为一个文本字段就足够了(而不是LONGTEXT)。谢谢你的提示。我试过了,但运气不好。由于我只存储ID和类名,我认为一个文本字段就足够了(而不是LONGTEXT)。在我这样做之前,它对我不起作用:Delayed::Backend::ActiveRecord::Job.attr_accessibleThanks for the update-可能是DelayedJob中的一个更改导致了这一点。如果其他人可以确认这一点(加上您正在使用的DJ版本会很有帮助),我会在回答中包含您的评论,直到我确认:Delayed::Backend::ActiveRecord::Job.attr_accessibleThanks for the update-可能是DelayedJob中的某个更改导致了这一点。如果其他人能证实这一点,我会在回答中包括你的评论(加上你正在使用的DJ版本会很有帮助)