2015-12-13 6 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 

EDIT:

Он выдает ошибку для просмотра.

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

Try для использования планировщика. –

+0

Вы можете использовать cronjob для удаления записи через 1 день. Просто установите end_time в базе данных и запустите фоновое задание, чтобы проверить, есть ли какой-либо продукт, который достиг конечного_time, и затем удалить этот продукт. –

+0

Нет проблем. Я знаю, как запустить это асинхронно, используя Sidekiq. Дело в том, что я не знаю, как заставить рубин работать с обратным отсчетом JS рабочего клиента. И как сказать Rails, что каждый раз, когда продукт создается, у него будет период 1 день (возможно, обратный вызов?). – Liroy

ответ

1

Просто чтобы быть ясно, @product не будет существовать после того, как вы закроете браузер - вы, вероятно, со ссылкой на Product объекта; это другое дело.


Если вы хотите создать Project объект, и иметь его тайм-аут, после дня, вы будете иметь возможность использовать какой-асинхронной системе хрон (я объясню в секунду).

Однако, вы просите что-то более уместную:

Дело в том, я не знаю, как получить рубин работать с моей рабочей стороне клиента 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 

Это будет сопровождаться соответствующей хрон:

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

 Смежные вопросы

  • Нет связанных вопросов^_^