【发布时间】:2011-08-27 09:46:14
【问题描述】:
我在这里有点不知所措。
我只是想延迟签到,例如,在用户定义的时间。我想让它尽可能简单。
编辑:已解决,见下文。
class MyController < ApplicationController
def new_checkin
# default venue is "SubMate"
@venue_id = params[:venue_id] || "4c2c3acd8abca59355760120"
@time = params[:time]
@checkin = Delayed::Job.enqueue(self.perform_checkin, :run_at => @time.minutes.from_now)
end
def perform_checkin
foursquare.checkins.add(:venueId => @venue_id, :broadcast => "private")
end
结果很奇怪:delayed_job 被保存,动作被执行(没有请求的@time 延迟),我仍然得到一个错误:
ArgumentError in MyController#new_checkin
Cannot enqueue items which do not respond to perform
我错过了什么?在用户请求延迟的情况下,我该如何执行这个延迟的工作?
谢谢!
更新
感谢下面的@Roman,不知道您可以将参数传递给延迟:
def new_checkin
@venue_id = params[:venue_id]
@time = params[:time]
@checkin = self.perform_checkin
end
def perform_checkin
foursquare.checkins.delay({:run_at => @time.minutes.from_now}).add(:venueId => @venue_id, :broadcast => "private")
end
【问题讨论】:
-
仅供参考,对我们来说,我们将
run_at作为第二个参数传递给enqueue,效果很好,例如:Delayed::Job.enqueue( job_to_run, run_at: 10.minutes.from_now )。