Фоновый рабочий Rails всегда терпит неудачу в первый раз, работает во второй

У меня есть рабочий 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

Но потом, когда воркер повторяет попытку чуть позже — всегда получается.

Мне действительно кажется, что что-то не инициализируется, когда должно... но я не могу это отследить.


person cmw    schedule 28.12.2013    source источник


Ответы (1)


Убедитесь, что process всегда true требуется как часть цепочки обратного вызова.

Поэтому перепишите это так:

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

Когда выполняется цепочка обратного вызова ActiveRecord, любые методы, возвращающие логическое значение, повлияют на цепочку — false отменит цепочку обратного вызова.

person Cody Caughlan    schedule 28.12.2013
comment
Потрясающий. Такого бы никогда не поймал. Спасибо! - person cmw; 29.12.2013