我創建了一個簡單的成就係統,並且想要引入delayed_job(2.1.4)來處理處理。然而,在delayed_jobs表程序欄始終是零,這會導致last_error文本:Job failed to load: instance of IO needed. Handler nil
Delayed_job(2.1.4)錯誤:作業加載失敗:需要IO實例。 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
The entry in the delayed_jobs表被創建。但是,處理程序始終爲NULL。我已經嘗試了各種各樣的東西(之前通過了完整的對象,現在去了id + classname,如下所述:Weird exception with delayed_job;在觀察者中嘗試了xxxTrophy.delay.progress(...);等等) - 都沒有運氣。
我也有
require 'yaml'
YAML::ENGINE.yamler= 'syck'
在我boot.rb.
值得一提的一件事:雖然last_error文本被delayed_job填充,但attempt和failed_at列仍然爲NULL。
我錯過了什麼?
UPDATE
我覈實,系列化工作正如人們所預料:
ruby-1.9.2-p290 :004 > TrophyJob.new(1, "User").to_yaml
=> "--- !ruby/struct:TrophyJob \nrecord_id: 1\nrecord_type: User\n"
您是否嘗試刪除yaml引擎自定義(或甚至可能)? – Nick
這條線對於YAML來說是必需的(例如我的區域設置)。我只是提到它,表明我認爲這個問題可能是由YAML序列化問題引起的 - 但是發現這種可能性不大。不過謝謝。 – emrass