在Rails中创建倒计时器,在后端重置

时间:2016-01-29 07:30:07

标签: javascript ruby-on-rails

我目前正在创建一个带有计时器的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();
   })
  }}

有关如何“检查”后端时间,同时仍进行测验以确保时间尚未用完的任何想法?

1 个答案:

答案 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中的时间戳同步。

编辑:保持所述时间戳的另一个可能的地方可能是在会话而不是数据库。