Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/52.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 购买Rails中的计时器_Ruby On Rails_Ruby On Rails 3_Delayed Job - Fatal编程技术网

Ruby on rails 购买Rails中的计时器

Ruby on rails 购买Rails中的计时器,ruby-on-rails,ruby-on-rails-3,delayed-job,Ruby On Rails,Ruby On Rails 3,Delayed Job,我希望创建一个类似Ticketmaster上的购买计时器,在订单回滚之前,您有x分钟的时间支付订单 不过,我不太清楚该怎么做。在有人提出这些建议后,查看了gem和railscast,它的功能似乎有所不同——延迟作业允许您延迟一项操作,但不会使延迟取决于其他任何事情的发生,我不知道如何做到这一点 我基本上是在寻找能让我 a) 有这样的(伪)代码吗 if job_timer == 0 @order.destroy #Some redirect/flash stuff end b) 在页

我希望创建一个类似Ticketmaster上的购买计时器,在订单回滚之前,您有x分钟的时间支付订单

不过,我不太清楚该怎么做。在有人提出这些建议后,查看了gem和railscast,它的功能似乎有所不同——延迟作业允许您延迟一项操作,但不会使延迟取决于其他任何事情的发生,我不知道如何做到这一点

我基本上是在寻找能让我

a) 有这样的(伪)代码吗

if job_timer == 0
   @order.destroy
   #Some redirect/flash stuff
end
b) 在页面上显示计时器(即,“在您的订单被撤销之前,您还有3分25秒要支付。”)

有什么主意做什么/去哪里看吗

谢谢


萨沙

你要找的就是这份工作

例如,您可以拥有一个遍历所有order对象的函数

def清除命令
#purge_at是order的一个属性,包含
#应删除订单的日期时间。
Order.where(“purge_at>={DateTime.current}”)。每个{Order | Order.destroy}
结束
第二个问题更像是一个javascript问题。其思想是,Rails将剩余时间传递给客户端,javascript使用Rails端提供的剩余时间创建计时器。将javascript放在视图文件中。理想情况下,您应该在资产文件夹中隔离javascript,但我不会在这里为您这样做

<script language="JavaScript">
TargetDate = <%= @order.purge_at - DateTime.current %>;
BackColor = "palegreen";
ForeColor = "navy";
CountActive = true;
CountStepper = -1;
LeadingZero = true;
DisplayFormat = "%%D%% Days, %%H%% Hours, %%M%% Minutes, %%S%% Seconds.";
FinishMessage = "It is finally here!";
</script>
<script language="JavaScript" src="http://scripts.hashemian.com/js/countdown.js"></script>

TargetDate=;
BackColor=“淡绿色”;
ForeColor=“海军”;
CountActive=true;
CountStepper=-1;
前导零=真;
DisplayFormat=“%%D%%天、%%H%%小时、%%M%%分钟、%%S%%秒。”;
FinishMessage=“终于到了!”;

延迟的工作是你想要的

例如,您可以拥有一个遍历所有order对象的函数

def清除命令
#purge_at是order的一个属性,包含
#应删除订单的日期时间。
Order.where(“purge_at>={DateTime.current}”)。每个{Order | Order.destroy}
结束
第二个问题更像是一个javascript问题。其思想是,Rails将剩余时间传递给客户端,javascript使用Rails端提供的剩余时间创建计时器。将javascript放在视图文件中。理想情况下,您应该在资产文件夹中隔离javascript,但我不会在这里为您这样做

<script language="JavaScript">
TargetDate = <%= @order.purge_at - DateTime.current %>;
BackColor = "palegreen";
ForeColor = "navy";
CountActive = true;
CountStepper = -1;
LeadingZero = true;
DisplayFormat = "%%D%% Days, %%H%% Hours, %%M%% Minutes, %%S%% Seconds.";
FinishMessage = "It is finally here!";
</script>
<script language="JavaScript" src="http://scripts.hashemian.com/js/countdown.js"></script>

TargetDate=;
BackColor=“淡绿色”;
ForeColor=“海军”;
CountActive=true;
CountStepper=-1;
前导零=真;
DisplayFormat=“%%D%%天、%%H%%小时、%%M%%分钟、%%S%%秒。”;
FinishMessage=“终于到了!”;

虽然延迟的工作可能可以解决这个问题,但它并不像前面的答案所说的那么简单

我想会是这样的:

order.rb:

after_create :schedule_check_payment

def schedule_check_payment
  self.delay(:run_at => 5.minutes.from_now, :queue => :payment_checks).check_payment
end

def check_payment
  self.reload
  unless payment_exists #check if the user has paid
    self.destroy
  end
end
我还可以想到一些关于这项技术的注意事项:

  • 延迟的工作人员在5分钟后有空时,检查将立即运行,但如果队列备份,则可能需要更长的时间。这就是我为延迟处理指定队列的原因。我相信您可以设置delayed_job,以便it的一个(或多个)工人只处理该队列中的作业。这样,如果你在将来开始使用延迟的任务来完成其他较慢的任务(很可能,这是一个非常方便的工具),他们就不太可能因为消耗所有延迟的处理资源而使你的付款支票陷入困境

  • 延迟作业序列化调用延迟方法的对象。如果订单本身的某些信息决定了是否已付款,请确保在check_payment方法中重新加载该订单(这就是原因所在),因为对象可能不会意识到该属性在计划作业后的5分钟内已更改。这就是为什么我在支票支付方法中调用self.reload


  • 虽然延迟的工作可能可以解决这个问题,但它并不像前面的答案所说的那么简单

    我想会是这样的:

    order.rb:

    after_create :schedule_check_payment
    
    def schedule_check_payment
      self.delay(:run_at => 5.minutes.from_now, :queue => :payment_checks).check_payment
    end
    
    def check_payment
      self.reload
      unless payment_exists #check if the user has paid
        self.destroy
      end
    end
    
    我还可以想到一些关于这项技术的注意事项:

  • 延迟的工作人员在5分钟后有空时,检查将立即运行,但如果队列备份,则可能需要更长的时间。这就是我为延迟处理指定队列的原因。我相信您可以设置delayed_job,以便it的一个(或多个)工人只处理该队列中的作业。这样,如果你在将来开始使用延迟的任务来完成其他较慢的任务(很可能,这是一个非常方便的工具),他们就不太可能因为消耗所有延迟的处理资源而使你的付款支票陷入困境

  • 延迟作业序列化调用延迟方法的对象。如果订单本身的某些信息决定了是否已付款,请确保在check_payment方法中重新加载该订单(这就是原因所在),因为对象可能不会意识到该属性在计划作业后的5分钟内已更改。这就是为什么我在支票支付方法中调用self.reload


  • 令人惊叹的。非常感谢你。因此,我可能应该创建一个函数,在第一次创建相关订单实例时,同时在该实例上启动一个delay_作业,并为purge_赋值。所以在模型中,在一个后创建调用或其他什么。然后把这个清除订单的方法也放到我的订单模型中?并在页面上使用计时器调用它?当用户提交订单时,您可以使
    purge\u at=created\u at+3天
    以便订单在3天后销毁。将延迟作业设置为每5分钟或其他时间运行一次,它将检查订单并删除当时通过清除的所有订单。如果用户必须支付的时间以天为单位,则该操作相当有效。如果更像是几分钟,那么获得准确的结果需要