2013-04-24 67 views
0

我正在開發一個新項目:後端有has_many「課程」,也有has_many「Steps」的用戶。JS事件觸發狀態機(rails)中的後端狀態更改?

我想javascript來驗證用戶的答案 - 即讓我們說,用戶輸入「6」,這是正確的答案。我會想象檢查的功能看起來像這樣。

function match_answer(course, answer){ 
} 

如果JS事件證明爲真,我希望它改變後端的state_machine。該state_machine如下:

class Step < ActiveRecord::Base 
... 

    state_machine initial: :pending do 
    state :pending, value: 0 
    state :finished, value: 1 

    event :finish do 
     transition :pending => :finished 
    end 

    event :restart do 
     transition :finished => :pending 
    end 
    end 
end 

爲什麼我要一個JavaScript事件改變狀態機的狀態,究其原因是因爲當用戶重新登錄,我想他們去合適的地方在使用過程中。

1)如何用javascript事件更改state_machine的狀態?更具體地說,如果match_answer函數證明爲真,我該如何將狀態從:掛起改爲:已完成。

2)假設正確答案(將檢查用戶的答案)存儲在數據庫中,我如何從數據庫中獲取正確的答案,以便在match_answer javascript函數中執行以檢查用戶的答案?

任何幫助或資源,你可以指向我會非常感激。

回答

0

1)在您的match_answer javascript函數中,使用AJAX發佈到您的服務器應用程序來更新他們所在的步驟。

2)在你的javascript中,你需要知道正確的答案,或者可能的問題列表和正確的答案。獲取這些信息的一種方法是使用gon gem,它基本上可以讓你像控制@instance變量一樣在你的控制器中設置數據,只有它在javascript中可用。缺點是,如果用戶曾經在頁面上查看源代碼並且看起來夠用,那麼答案將是可見的。另一種方法是通過AJAX獲取請求從服務器單獨獲取它們,但用戶也許能夠窺探流量並找到它們(如果看起來可能的話)。

也許是一種更好的方法,因爲無論如何你會爲每個答案命中服務器,而是使用AJAX將用戶的答案發布到服務器。如果它是正確的,服務器可以更新用戶所在的步驟並返回200狀態碼。如果這是錯誤的答案,服務器可以返回422狀態碼。您的ajax可以使用成功回調或來自ajax請求的錯誤回調來正確響應。