JS事件触发状态机(rails)中的后端状态更改?

时间:2013-04-24 15:04:48

标签: javascript ruby-on-rails ruby ajax state-machine

我正在开发一个新项目:后端的用户有很多“课程”,也有很多“步骤”。

我希望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函数证明为true,我如何将状态从:pending更改为:finished。

2)假设正确的答案(将根据用户的答案进行检查)存储在数据库中,我如何从数据库中获取正确答案,以便在match_answer javascript函数中实现它以检查用户的答案?

非常感谢您指出的任何帮助或资源。

1 个答案:

答案 0 :(得分:0)

1)在你的match_answer javascript函数中,使用AJAX帖子到服务器应用程序来更新它们所处的步骤。

2)在你的javascript中,你需要知道正确的答案,或者可能是一个问题清单和正确的答案。获取此信息的一种方法是使用gon gem,它基本上允许您在控制器中设置数据,就像@instance变量一样,只有它在您的javascript中可用。缺点是,如果用户在页面上执行了查看源并且看起来足够努力,则答案将是可见的。另一种方法是通过AJAX get请求从服务器单独获取它们,但是如果可能的话,用户可能再次窥探流量并找到它们。

也许是一种更好的方法,因为无论如何你要为每个答案点击服务器,都会使用AJAX来发布用户对服务器的回答。如果正确,服务器可以更新用户所在的步骤并返回200状态代码。如果这是一个错误的答案,服务器可以返回422状态代码。您的ajax可以使用成功回调或来自ajax请求的错误回调来进行适当的响应。