如何设置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);
答案 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 %>"> </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