私は 2 つのテーブルを持ってQuestion
おり、質問モデルには、2 つのテーブル間の関連付けをおよび 回答モデルAnswer
として定義する行があります。has_many Answer
belongs_to Question
Questions
表には、、id
、title
およびsubtitle
の列がありquestion_type
ます。
テーブルには、次の 2 つの列がありAnswers
ます。question_id
text
_form.html.erb でフォームをセットアップして、定義済みの質問セット (たとえば、質問 ID 1,2,5,6,11) を取得できるようにします。さらに、フォームはそのセットに従って、フォームに必要なものを動的に作成します。次のコードは、そのようなことを行うために私が持っているものです:
(asset
は、定義済みの質問セットと質問に関連付けられた回答を格納する配列です。各質問は、対応する質問に関連するすべての情報を格納する OpenStruct です)
<% field_names = Array.new %>
<% set.each do |question| %>
<%= f.label question.question %>
<%= f.label question.question_subtitle %>
<% case question.question_type %>
<% when "check box" %>
<%= f.label question.question_type %>
<% question.answers.each do |answer| %>
<%= check_box_tag(answer.answer_id) %>
<%= label_tag(question.id, answer.text) %>
<%
field_names.append(params[answer.answer_id])
%>
<% end %>
<% when "text field" %>
<%= f.label question.question_type %>
<% question.answers.each do |answer| %>
<%= answer.text %>
<%= text_field(question.question_id, answer.answer_id) %>
<%
s = ((question.question_id).to_s + "[" + (answer.answer_id).to_s + "]")
field_names.append(params[s])
%>
<% end %>
<% when "scale" %>
<%= f.label question.question_type %>
<%
range = Array.new
question.answers.each do |answer|
range.append(answer.text)
end
field_names.append(params[question.answers[0].answer_id])
%>
<%= select_tag(question.answers[0].answer_id, options_for_select(range[0]..range[1])) %>
<% end %>
<br/>
<% end %>
質問は、送信ボタンをクリックしたときに、質問 ID に従ってフォーム内のすべてのユーザー入力を取得するにはどうすればよいかということです。
1つの質問に対して、同じ種類の質問が複数あり、回答欄が複数ある場合を考えています。それとも、私が望むものも達成するこれよりも良い方法はありますか?
編集: 上記の ruby 埋め込みコードによって生成された HTML コードが役立つ場合は、次のとおりです。
<label for="tracker_question 1">Question 1</label>
<label for="tracker_question 1 Subtitle">Question 1 subtitle</label>
<label for="tracker_check box">Check box</label>
<input id="1" name="1" type="checkbox" value="1" />
<label>answer 1-1</label>
<input id="2" name="2" type="checkbox" value="1" />
<label>answer 1-2</label>
<br/>
<label for="tracker_question 2">Question 2</label>
<label for="tracker_question 2 Subtitle">Question 2 subtitle</label>
<label for="tracker_text field">Text field</label>
answer 2-1
<input id="11_3" name="11[3]" size="30" type="text" />
answer 2-2
<input id="11_4" name="11[4]" size="30" type="text" />
<br/>
<label for="tracker_question 3">Question 3</label>
<label for="tracker_question 3 Subtitle">Question 3 subtitle</label>
<label for="tracker_scale">Scale</label>
<select id="5" name="5">
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
<option value="5">5</option>
<option value="6">6</option>
<option value="7">7</option>
<option value="8">8</option>
<option value="9">9</option>
</select>
編集:
コードを少し変更して、同じプロパティを持つすべてのフィールドが同じ名前を使用するのではなく、各フィールドが異なる名前を使用するようにしました。ただし、名前は回答 ID に依存し、テキスト フィールドの場合は、回答 ID と質問 ID の両方になります。
このように、before_save
リダイレクトを使用してこれらのフィールドにアクセスできるのではないかと考えています。これは、次のようなハッシュが生成されるためです。
{"utf8"=>"✓",
"authenticity_token"=>"DgdKpdecD+jmq1EvAIPxzjFxHGOUkJXoE10VpCBtxqU=",
"tracker"=>{"patient_id"=>"1"},
"1"=>"1",
"11"=>{"3"=>"test1",
"4"=>"test2"},
"5"=>"6",
"commit"=>"Create Tracker"}
したがって、フィールド名を取得するために呼び出される別の変数を作成field_names
しましたが、思い通りに動作しないようです。どんな助けでも大歓迎です!