Создание таймера обратного отсчета в Rails, который сбрасывается на бэкэнд

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

В моей первой версии я сделал это простым способом: создав переменную для таймера, экземпляр в секундах, а затем сделав его частью JavaScript 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. Предыдущий вопрос ссылается на обратный отсчет 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 с соответствующим значением базы данных "try_timestamp":

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

Тогда у вас может быть фильтр before, который определяет, закончилось ли время на ваших конечных точках 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 Idea: вы также можете добавить конечную точку, которая отвечает записанной меткой времени для синхронизации часов js с меткой времени в db.

Изменить: другое место, чтобы сохранить указанную временную метку в сеансе, а не в базе данных.