我目前正在创建一个带有计时器的Rails测验应用程序,该计时器会倒计时回答问题的秒数。
在我的第一个版本中,我这样做的方法很简单:为计时器创建一个变量,为秒创建一个实例,然后将其作为测验的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。
在该gem的文档中,它显示了如何直接将倒计时时间传递到视图中。但是,我正在使用倒计时值(换句话说,当它达到零时)强制用户在录制错误答案时发出下一个问题,如下所示,作为我验证的一部分:
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();
})
}}
有关如何“检查”后端时间,同时仍进行测验以确保时间尚未用完的任何想法?
答案 0 :(得分: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
然后你可以有一个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
侧面构思:您还可以添加一个响应记录时间戳的端点,以便将js时钟与db中的时间戳同步。
编辑:保持所述时间戳的另一个可能的地方可能是在会话而不是数据库。