Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/61.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.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_Duration - Fatal编程技术网

Ruby on rails rails上的对象持续时间

Ruby on rails rails上的对象持续时间,ruby-on-rails,ruby,duration,Ruby On Rails,Ruby,Duration,如何设置我的产品对象的持续时间?因此,当用户创建产品时,它会将JS计数器设置为1天,然后在时钟用完时销毁/停用@product 我知道如何使用Sidekiq异步运行它。问题是我不知道如何让ruby与我的工作客户端JS倒计时一起工作。还有,如何告诉Rails每次创建一个产品都有一天的时间(可能是回调?) 编辑: 它为视图抛出一个错误 Illegal nesting: content can't be both given on the same line as %div and nested wi

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

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

编辑:

它为视图抛出一个错误

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);
函数getTimeRemaining(endtime){
var t=Date.parse(endtime)-Date.parse(new Date());
var秒=数学地板((t/1000)%60);
var分钟=数学地板((t/1000/60)%60);
可变小时数=数学楼层((t/(1000*60*60))%24);
风险天数=数学下限(t/(1000*60*60*24));
返回{
“总计”:t,
“天”:天,
“小时”:小时,
“分钟”:分钟,
“秒”:秒
};
}
函数初始化锁(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');
函数updatelock(){
var t=GetTime剩余时间(endtime);
daysSpan.innerHTML=t.days;
hoursSpan.innerHTML=('0'+t.hours).slice(-2);
minuteSpan.innerHTML=('0'+t.minutes).slice(-2);
secondsSpan.innerHTML=('0'+t.seconds).slice(-2);

如果(t.total只是为了清楚起见,
@product
在您关闭浏览器后将不存在-您可能指的是
产品
对象;这是另一回事


如果您想创建一个
项目
对象,并在一天后使其超时,那么您可以使用某种异步cron系统(我稍后将解释)

但是,您提出的问题更为相关:

问题是我不知道如何让ruby与我的工作客户端JS倒计时一起工作

您只需确保能够将倒计时与
@产品绑定。在
属性处创建:

#app/controllers/products_controller.rb
class ProductsController < ApplicationController
   def show
      @product = Product.find params[:id]
   end
end
这将伴随着适当的cron作业:

0 8 * * * /bin/bash -l -c 'cd /my/project/releases/current && RAILS_ENV=production rake products:remove 2>&1'
这里有一个很好的问题:

尝试使用调度程序来完成此操作。您可以使用cronjob在1天后删除记录。只需在数据库中设置结束时间并运行后台作业,检查是否有任何产品已达到结束时间,然后删除该产品。没问题。我知道如何使用Sidekiq异步运行此操作。问题是我不知道如何让ruby正常工作k与我的工作客户端JS倒计时。还有,如何告诉Rails每次创建一个产品都会有一天的时间(可能是回调?)。Rich,非常感谢你的回答!不过有几点,我用必要的代码编辑了我的问题供你审阅。暂时搁置cron作业(删除旧记录),我如何告诉Rails每次创建
产品
对象时,它都会将JS倒计时持续时间设置为1天?当时钟用完时,它会在产品表中标记
结束时间
#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);
#lib/tasks/product_removal.rake
namespace :products do
  desc "Remove
  task :remove => :environment do
     Product.destroy_all('created_at < ?', 1.day.ago)
  end
end
0 8 * * * /bin/bash -l -c 'cd /my/project/releases/current && RAILS_ENV=production rake products:remove 2>&1'