Rails后台工作者总是第一次失败,第二次工作

时间:2013-12-28 22:25:14

标签: ruby-on-rails ruby ruby-on-rails-3 sidekiq

我有一个sidekiq工作者在保存对象后触发:

class Post < ActiveRecord::Base

  attr_accessible :description, 
                  :name,
                  :key 

  after_save :process

  def process
    ProcessWorker.perform_async(id, key) if key.present?
  end

  def secure_url
    key.match(/(.*\/)+(.*$)/)[1]
  end

  def nonsecure_url
    key.gsub('https', 'http')
  end

end

工人看起来如下(它尚未完成......只是测试):

class ProcessWorker
  include Sidekiq::Worker

  def perform(id, key)

    post = Post.find(id)
    puts post.nonsecure_url

  end
end    

奇怪的是,每次工作人员开火时,它最初会因以下错误而失败:

undefined method `gsub' for nil:NilClass

然而,当工人稍后重试时 - 它总是成功。

真的感觉好像什么东西没有初始化它应该......但我似乎无法追踪它。

1 个答案:

答案 0 :(得分:4)

确保process 始终 true - 这是回调链中的一部分。

所以重写如下:

def process
  ProcessWorker.perform_async(id, key) if key.present?
  true
end

当执行ActiveRecord回调链时,任何返回布尔值的方法都会影响链 - false将取消回调链。