2015-12-13 72 views
1

如何設置我的Product對象的持續時間?因此,當產品由用戶創建時,它將JS計數器設置爲1 day,然後在時鐘用完時銷燬/取消激活@product對象持續時間ruby on rails

我知道如何使用Sidekiq異步執行此操作。事情是我不知道如何讓我的工作客戶端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

您可以使用cronjob在1天后刪除記錄。只需在數據庫中設置end_time並運行後臺作業,以檢查是否存在end_time已達到的產品,然後刪除該產品。 –

+0

沒問題。我知道如何使用Sidekiq異步運行。事情是我不知道如何讓我的工作客戶端JS倒計時紅寶石工作。而且,如何告訴Rails每次創建產品時都會有1天的時間(可能是回調?)。 – Liroy

回答

1

只是要清楚,@product將不存在關閉瀏覽器後 - 你可能指的是Product對象;這是另一回事。


如果你想創建一個Project對象,並把它超時了一天之後,你可以使用某種異步的cron系統(我將在第二個解釋)。

但是,你所要求的東西比較中肯:

的事情是,我不知道如何獲得紅寶石與我合作的客戶端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作業在OS上調用,它們可用於在任何應用程序中調用任何類型的請求。隨着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

+0

豐富,非常感謝您的回答!雖然有幾點,我編輯了我的問題,並附上必要的代碼供您審閱。現在暫時擱置cron作業(刪除舊記錄),我如何告訴Rails每次創建一個'Product'對象時,它都會將JS的倒數持續時間設置爲1天?並且,當時鍾耗盡時,它會在產品表中標記'end_time'? – Liroy