【问题标题】:Rails - Delayed Job of specific method with run_at in params / specifying when to postRails - 参数中带有run_at的特定方法的延迟作业/指定何时发布
【发布时间】: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 )

标签: ruby-on-rails delayed-job


【解决方案1】:

如果你想以这种方式入队,那么正如错误提示的那样,入队的对象应该响应 :perform。检查这个http://asciicasts.com/episodes/171-delayed-job 您还可以使用 :handle_asynchronously 或 .delay.method。检查这个:https://github.com/collectiveidea/delayed_job

【讨论】:

  • 感谢 Roman,我不知道您可以将参数传递给 .delay - 我更新了我的问题(已解决)。
猜你喜欢
  • 2013-04-20
  • 2017-11-09
  • 1970-01-01
  • 2011-12-02
  • 2012-02-16
  • 2015-03-11
  • 1970-01-01
  • 2018-02-13
  • 1970-01-01
相关资源
最近更新 更多