Создание таймера обратного отсчета в 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.
Изменить: другое место, чтобы сохранить указанную временную метку в сеансе, а не в базе данных.