2016-01-29 1 views
11

В настоящее время я создаю приложение виртуализации Rails с таймером, который отсчитывает оставшиеся секунды, чтобы ответить на вопрос.Создание таймера обратного отсчета в Rails, который сбрасывается на backend

В своей первой версии, я сделал это простой способ: создать переменную для таймера, экземпляр для секунд, а затем делает его часть Javascript викторины, как и так:

Quiz = function() { 
    this.quizCurrent = 0; 
    this.score = 0; 
    this.seconds = 10; 
    this.timing = this.seconds; 
    this.container = $('#trivia'); 
    this.participationId = null; 
} 

Quiz.prototype.init = function() { 
    $('#trivia').on('click', '.btn.btn-primary-questions', this.checkAnswer.bind(this)); 
    $('div.timer strong').text(this.seconds) 

    this.start(); 
} 

Я бы теперь нужно переместить это на бэкэнд с помощью Rails. В предыдущем вопросе ссылается на countdown gem, но это, кажется, представляет два вопроса:

1) Мне нужно будет многократно называть дату/время и проверять для каждого вопроса (что я не думаю, что могу делать с обратным отсчетом) а также;

2) В идеале я мог бы передать это значение в Javascript как переменную.

В документации к этому драгоценному камню показано, как вы можете напрямую передать время обратного отсчета в представление. Тем не менее, я использую значение обратного отсчета времени (другими словами, когда он достигнет нуля), чтобы заставить пользователя к следующему вопросу во время записи неправильный ответ, как показано ниже, как часть моей проверки:

Quiz.prototype.timer = function() { 
var that = this; 

this.timing--; 
    $('div.timer strong').text(this.timing); 
    if (this.timing <= 0) { 
    self.stop(); 
    $.getJSON('/api/skip_question/' + this.participationId, function() { 
    that.nextQuestion(); 
    }) 
    }} 

Любые идеи о том, как я могу «проверить» время на бэкэнд, но при этом проверять викторину, чтобы убедиться, что время не закончилось?

ответ

1

Я ничего не знаю об обратном отсчете, но на ум приходит простое решение.

Допустим, вы сохранили временную метку на бэкэнд, и когда начнется ваша викторина js, задняя часть знает, что викторина началась.

$.getJSON('/api/start_quiz/', function() { 
    //do whatever javascript starts the quiz. 
}) 

на внутреннем интерфейсе, предположим у вас есть модель QuizAttempt с соответствующим значением базы данных «attempt_timestamp»:

def start_quiz 
    QuizAttempt.create(user_id: current_user.id, attempt_timestamp: Time.now) 
end 

Тогда вы могли бы иметь перед фильтром, который определяет, если время истекло на вашем skip_question и конечные точки answer_question. (В моем примере есть 8 минут лимит время

before_filter :check_time, only: [:skip_question, :answer_question] 

def check_time 
    #get last attempt 
    last_attempt = QuizAttempt.where(user_id: current_user.id).last 
    if (last_attempt.attempt_timestamp + 8.minutes) < Time.now 
    #time is up 
    return false 
    end 
end 

Side Идея:. Вы также можете добавить конечную точку, которая отвечает с записанной меткой времени с целью syncronizing часов Js с отметкой времени в БД

.

Редактировать: еще одно возможное место для хранения указанной метки времени может быть в сеансе, а не в базе данных.

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