我正在为Rails的学生构建一个应用程序。该应用程序有一系列测试(多项选择题,填空,等等)。要运行测试,用户从索引视图中创建一个新的“test”对象,其中包含一列“score”。 “得分”最初设置为0。
然后,create action转发到名为“question1”的动作,传递新的“test”对象。在新视图中向用户呈现问题以及通过表单将他们的答案发送到控制器的方式。如果它们的响应与控制器中列出的响应匹配,则传递给“question1”操作的测试对象将其“score”属性增加1.如果用户未正确回答,则不会增加score属性。无论哪种方式,当答案传递给控制器时,向用户呈现一个按钮,允许他们移动到下一个动作“问题2”。表单上的提交按钮(实际上是“测试”对象的更新按钮)消失,用户被迫继续进行下一个操作。这是唯一的选择。
此过程一直持续到最终页面显示总分。不是很复杂。 “测试”对象基本上跟随用户通过不同的视图/动作,直到他们到达给出他们得分的最终视图。
我的问题:这个系统存在缺陷!如果用户使用浏览器中的后退箭头,他们可以重新提问。他们甚至可以多次回答同一个问题,提高他们的分数。有没有办法阻止我的“测试”对象多次使用它的动作?如果每个对象可以某种方式仅限于在控制器中使用一次问题动作,则可以解决这个问题。以下是tests_controller.rb中我的一个问题操作的示例:
def question1
@test = Test.find(params[:id])
correct_answer = "<p>"
user_answer = params[:answer]
if user_answer == correct_answer
flash.now[:success] = "That is correct!"
new_score = @test.score += 1
@test.update(score: new_score)
elsif params[:answer].present? && params[:answer] != correct_answer
flash.now[:danger] = "Wrong answer."
end
end
以下是相应的观点:
<%= form_tag question1_path(@test), method: :get do %>
<h5>1. How do you write an opening paragraph tag in HTML?</h5>
<div class="form-group">
<%= text_area_tag :answer, params[:answer], class: 'form-control'%>
</div>
<% if !flash[:success] && !flash[:danger] %>
<div class="form-group">
<%= submit_tag "Submit", class: "btn btn-primary" %>
</div>
<% end %>
<% end %>
<% if flash[:success] || flash[:danger] %>
<%= link_to "Next Question", question2_path(@test), class:"btn btn-success pull-right" %>
<% end %>