学生が試験を受けるためのフォームを作成しようとしています(多肢選択式の質問があります)。
関連するモデルは次のとおりです。
Exam has_many :questions
has_one :grade
accepts_nested_attributes_for :questions
Question has_many :answers
accepts_nested_attributes_for :answers
Grade belongs_to :exam
belongs_to :subscription
アプリケーションのフォームにSimple_formを使用しています。試験を行うためのフォームは、fields_forといくつかのjavascriptを使用して実行および動作します(ネストされたフォームのrailscastに示されています)。今、私は試験を受けるためのフォームを作成しようとしています。
入力は、各質問のラジオボタンのセットのみです。ユーザー入力はスコアの計算に使用され、スコアはグレードモデルに保存される唯一の情報になります。私はこれをどのように機能させるか途方に暮れていることを認めなければなりません。Grade#newビューについてこれまでに持っているものは次のとおりです。
<%= simple_form_for [@subscription, @grade], :html => { :class => 'form-horizontal' } do |f| %>
<fieldset>
<legend>Exam for <%= @lesson.name.capitalize %></legend>
<% @questions.each do |question| %>
<%= simple_fields_for :questions do |builder| %>
<ol>
<li>
<p><%= question.text %></p>
<%= f.input :answer, :collection => question.answers, :as => :radio_buttons %>
</li>
</ol>
<% end %>
<% end %>
<div class="form-actions">
<%= f.submit "Submit Exam", :class => "btn btn-primary" %>
<%= link_to "Cancel", lesson_exam_path(@lesson, @exam), :class=>"btn" %>
</div>
</fieldset>
<% end %>
これにより、(ほとんどの場合、とにかく)正しく見えるフォームが生成されますが、ラジオボタンはすべて1つのセットの一部です。1つの質問の回答を選択すると、同じセットの一部であるため、他のすべての質問から回答の選択が解除されます。生成された適切なHTMLは次のとおりです。
<input class="radio_buttons optional" id="grade_answer_31" name="grade[answer]" type="radio" value="31"/>
もちろん、ここでの問題はname=
html属性にあります。グレードを指しています。私はそれがのようなものである必要がありますname="grade[:question_id][:answer_id]"
。それがあれば、コントローラーで簡単に情報を収集し、必要な計算を行うことができました。
成績は最終的に作成されるものであるため、grades_controllerでビューを作成していますが、質問と回答は試験モデルの下にネストされているため、このフォーム/アクションがどこにあるべきかについて少し混乱しています。take_exam
でアクションを実行し、exams_controller
そこからグレードを作成する必要がありますか?