2016-01-29 33 views
11

पर रीसेट में रेल में एक उलटी गिनती टाइमर बनाना, मैं वर्तमान में एक टाइमर के साथ एक रेल क्विज़ एप्लिकेशन बना रहा हूं जो प्रश्न का उत्तर देने के लिए छोड़े गए सेकंड को गिना जाता है। सेकंड के लिए टाइमर के लिए एक चर, उदाहरण बनाकर, और फिर इसे प्रश्नोत्तरी के जावास्क्रिप्ट का हिस्सा बना रही है, इसलिए जैसे:बैकएंड

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(); 
} 

मैं करूंगा

मेरा पहला संस्करण में, मैं इस एक आसान तरीका किया अब इसे रेल का उपयोग करके बैकएंड में ले जाना पसंद है। एक पिछला प्रश्न countdown gem का संदर्भ देता है, लेकिन ऐसा लगता है कि दो समस्याएं मौजूद हैं:

1) मुझे बार-बार तारीख/समय पर कॉल करने और प्रत्येक प्रश्न के लिए मान्य करने की आवश्यकता होगी (जो मुझे नहीं लगता कि मैं उलटी गिनती के साथ कर सकता हूं) तथा;

2) मैं आदर्श रूप से इस मान को जावास्क्रिप्ट में एक चर के रूप में पास कर सकता हूं।

उस मणि के लिए प्रलेखन में, यह दिखाता है कि आप सीधे उलटी गिनती समय को कैसे देख सकते हैं। हालांकि, मैं उलटी गिनती मूल्य उपयोग कर रहा हूँ (दूसरे शब्दों में, जब यह शून्य हो जाती है) अगले प्रश्न के लिए उपयोगकर्ता के लिए मजबूर करने, जबकि, एक गलत जवाब रिकॉर्डिंग नीचे की तरह, मेरी मान्यता के हिस्से के रूप:

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

मुझे उलटी गिनती के बारे में कुछ भी पता नहीं है, लेकिन एक साधारण समाधान दिमाग में आता है।

मान लें कि आप बैकएंड पर टाइमस्टैम्प रखते हैं और जब आपका जेएस क्विज़ शुरू होता है तो यह पीछे की ओर जाने देता है कि प्रश्नोत्तरी शुरू हो गई है।

$.getJSON('/api/start_quiz/', function() { 
    //do whatever javascript starts the quiz. 
}) 
बैकएंड पर

देता मान लें कि आपके 'attempt_timestamp' इसी डेटाबेस मूल्य के साथ एक QuizAttempt मॉडल है:

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

तो फिर तुम फिल्टर करता है, तो समय अपने skip_question पर समाप्त हो गया है निर्धारित करता है कि पहले एक हो सकता था और answer_question endpoints। (मेरे उदाहरण में वहाँ एक 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 

:। तुम भी एक अंतबिंदु कि DB में टाइमस्टैम्प के साथ जे एस घड़ी स्पेस सक्रियता के प्रयोजन के लिए दर्ज की गई टाइमस्टैम्प के साथ प्रतिक्रिया करता है जोड़ सकता है

संपादित करें: टाइमस्टैम्प रखने के लिए एक और संभावित स्थान डेटाबेस के बजाय सत्र में हो सकता है।