之前,我曾发布过此问题-并认为已解决:
但是,在继续测试和开发之后,该错误又回来了,但是方式有所不同。
我正在使用Sidekiq(与Rails 3.2.8,Ruby 1.9.3一起)运行后台进程after_save。下面是我的模型,工作人员和控制器的代码。
模型:
class Post < ActiveRecord::Base
attr_accessible :description,
:name,
:key
after_save :process
def process
ProcessWorker.perform_async(id, key) if key.present?
true
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
(已更新)控制器:
def create
@user = current_user
@post = @user.posts.create(params[:post])
render nothing: true
end
无论何时采用哪种方法,无论何时首次调度作业,它们最初都会失败:
undefined method `gsub' for nil:NilClass
然后,它们总是在第一次重试时成功。
我遇到了以下github问题,该问题似乎已解决–与同一问题有关:
https://github.com/mperham/sidekiq/issues/331
在这里,人们说如果他们创建初始化程序来初始化模型上的ActiveRecord方法,那么它可以解决他们的问题。
为此,我尝试在lib / initializers中创建一个名为sidekiq.rb的初始化程序,并使用以下内容来简单地初始化Post模型上的方法:
Post.first
现在,创建的第一个作业首次成功完成。很好 但是,创建的第二份工作第一次失败-并在重试后完成...使我回到开始的地方。
这真的让我大吃一惊–有人遇到过同样的问题吗?任何帮助表示赞赏。
从更改模型回调after_save
到after_commit
了create
行动。有时,sidekiq可以在模型实际完成保存到数据库之前初始化您的worker。
after_commit :process, :on => :create
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句