对象持续时间ruby on rails

时间:2015-12-13 08:01:20

标签: ruby-on-rails ruby duration

如何设置Product对象的持续时间?因此,当用户创建产品时,它会将JS计数器设置为1 day,然后在时钟用完时销毁/取消激活@product

我知道如何使用Sidekiq异步运行它。问题是我不知道如何让ruby与我的工作客户端JS倒计时一起工作。而且,如何告诉Rails每次创建产品时都会有1天的时间(可能是回调?)。

def end_time
  self.destroy in 1.days 
  self.update_attribute(:end_time, Time.now)
end

编辑:

它会为视图抛出错误。

Illegal nesting: content can't be both given on the same line as %div and nested within it.

这是模特。

       #countdown{"data-created-at" => @product.created_at}  
                %digits
                    %span.days
                    %pcd DAYS
                %digits
                    %span.hours
                    %pcd HRS
                %digits
                    %span.minutes
                    %pcd MINS
                %digits
                    %span.seconds
                    %pcd SECS

products.js

   function getTimeRemaining(endtime){
  var t = Date.parse(endtime) - Date.parse(new Date());
  var seconds = Math.floor( (t/1000) % 60 );
  var minutes = Math.floor( (t/1000/60) % 60 );
  var hours = Math.floor( (t/(1000*60*60)) % 24 );
  var days = Math.floor( t/(1000*60*60*24) );
  return {
    'total': t,
    'days': days,
    'hours': hours,
    'minutes': minutes,
    'seconds': seconds
  };
}

function initializeClock(id, endtime){
  var clock = document.getElementById(id);
  var daysSpan = clock.querySelector('.days');
  var hoursSpan = clock.querySelector('.hours');
  var minutesSpan = clock.querySelector('.minutes'); 
  var secondsSpan = clock.querySelector('.seconds');

  function updateClock(){
    var t = getTimeRemaining(endtime);

    daysSpan.innerHTML = t.days;
    hoursSpan.innerHTML = ('0' + t.hours).slice(-2);
    minutesSpan.innerHTML = ('0' + t.minutes).slice(-2);
    secondsSpan.innerHTML = ('0' + t.seconds).slice(-2);

    if(t.total<=0){
      clearInterval(timeInterval);
    }
  }

  updateClock();
  var timeInterval = setInterval(updateClock,1000);
}

var deadline = 'December 15 2015 00:00:50 UTC+0200';
initializeClock('countdown', deadline);

1 个答案:

答案 0 :(得分:1)

为了清楚起见,关闭浏览器后@product将不存在 - 您可能指的是Product对象;这是另一回事。

如果你想创建一个Project对象,并在一天之后让它超时,你就可以使用某种异步cron系统(我会在一秒钟内解释)。

但是,你要问更相关的事情:

  

事情是我不知道如何让ruby与我的工作客户端JS倒计时

一起工作

您只需要确保能够将倒计时与@product.created_at属性绑定:

#app/controllers/products_controller.rb
class ProductsController < ApplicationController
   def show
      @product = Product.find params[:id]
   end
end

这将允许您致电:

#app/views/products/show.html.erb
<div id="countdown" data-created-at="<%= @product.created_at %>">&nbsp;</div>

#app/assets/javascripts/application.js
function getTimeRemaining(endtime){
  var t = Date.parse(endtime) - Date.now();
  var seconds = Math.floor( (t/1000) % 60 );
  var minutes = Math.floor( (t/1000/60) % 60 );
  var hours = Math.floor( (t/(1000*60*60)) % 24 );
  var days = Math.floor( t/(1000*60*60*24) );
  return {
    'total': t,
    'days': days,
    'hours': hours,
    'minutes': minutes,
    'seconds': seconds
  };
}

var timeleft = getTimeRemaining($("#countdown").data("created-at"));
$("#countdown").html(timeleft);

这应该为您提供JS中所需的倒计时。

-

关于Product的实际删除,您将不得不使用其中一个调度宝石,但实际上,它们都是使用cron job的覆盖 - 在OS中调用的命令 - 电平。

在操作系统上调用Cron作业,它们可用于在任何应用程序中调用任何类型的请求。使用Rails应用程序时,最好使用rake task,如下所示:

#lib/tasks/product_removal.rake
namespace :products do
  desc "Remove
  task :remove => :environment do
     Product.destroy_all('created_at < ?', 1.day.ago)
  end
end

这将伴随着适当的cron工作:

0 8 * * * /bin/bash -l -c 'cd /my/project/releases/current && RAILS_ENV=production rake products:remove 2>&1'

这里有一个很好的问题: Erase records every 60 days