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 %>"> </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'