@service = Service.all @service.first().delay.update_attributes(params['xxx'])
以上这样是可以的
@service = Service.all @service.delay.each do |s| s.update_attributes(params['xxx']) end
这样这个 deley 就是把@service遍历了下,但是根本没做下面的 update_attributes
请问这样我该怎么解决呢
你传个 block 过去要 delay,里面还包含了外部引用的变量,这显然不可能啊,封装到另外一个方法吧
#1 楼 @ShiningRay 哦,其实没变量的,这个只是我稍微举下例子,没想到乌龙了…… 封装的另外的方法是指什么样呢?这样么
def fun1 self.delay.fun2 end def fun2 @service = Service.all @service.each do |s| s.update_attributes(params['xxx']) end end
我感觉我这样写应该是错的……
#2 楼 @zhbinx 果然。can't dump anonymous module: #<Module:0xa71de28>,错在self.delay.fun2这句话
can't dump anonymous module: #<Module:0xa71de28>
self.delay.fun2
#4 楼 @zhbinx 用 delay 的话 delay 方法的 callee 必须是可序列化的。貌似你直接把这两方法放到匿名模块里去了。可以直接 enqueue 一个实现了 perform 方法的可序列化对象。
delay
callee
enqueue
perform
class ServiceUpdateJob def perform Service.find_each do |s| ... end end end Delayed::Job.enqueue ServiceUpdateJob.new
https://github.com/collectiveidea/delayed_job#custom-jobs
#5 楼 @doitian 我这样做了还报错,能不能帮我看看,谢谢 1.我在/lib 文件夹下加了delay_check.rb
delay_check.rb
class DelayCheck < Struct.new(:services) def perform services.each do |service| begin response = HTTParty.get(service.url) response_code = response.code rescue response_code = 0 end service.update_attributes(:return_code => response_code) end end end
2.在页面对应的 action 中有如下方法
def all @services =ServiceCheck.all Delayed::Job.enqueue(DelayCheck.new(@services)) flash[:notice] = 'xxxxxxxx' redirect_to service_checks_path end
执行 all 操作的时候还是报 uninitialized constant ServiceChecksController::DelayCheck 我是照这个地址做的http://asciicasts.com/episodes/171-delayed-job
uninitialized constant ServiceChecksController::DelayCheck
#5 楼 @doitian 额,我把delay_check.rb移到 app/models 下面就好了,能跑了。。。没事了,谢谢你之前的帮助
不要把 active record 的对象直接放进去。最好传 ID,然后在 DelayCheck 里从数据库去取。
DelayCheck