1

単純なアチーブメントシステムを作成し、delayed_job(2.1.4)を導入して処理を処理したいと思いました。ただし、delayed_jobsテーブルのハンドラ列は常にnilであるため、last_errorテキストが生成されます。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

delayd_jobsテーブルのエントリが作成されます。ただし、ハンドラーは常にNULLです。私はすでにさまざまなことを試しました(以前は完全なオブジェクトを通過しましたが、ここで説明するようにid + classnameを使用しました: delayed_jobでの奇妙な例外;オブザーバーでxxxTrophy.delay.progress(...)を試しました;など)-すべてなしラック。

私も持っています

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

私のboot.rbで。

言及する価値のある1つのこと:last_errorテキストはdelayed_jobで埋められますが、attempts列とfailed_at列はNULLのままです。

私は何が欠けていますか?

アップデート

シリアル化が期待どおりに機能することを確認しました。

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

2 に答える 2

4

解決策を見つけました:私の問題は大量割り当て保護が原因でした。一括割り当てから保護するための初期化子があります。

# 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
于 2011-11-01T16:49:08.120 に答える
1

ハンドラー列が小さすぎて、何を入れているのかわからない可能性があります。次のような移行でこれを修正できます。

change_column :delayed_jobs, :handler, :text, :limit => 64.kilobytes + 1
于 2011-11-01T15:08:44.793 に答える