我有两个表Question
,并且Answer
在 Question 模型中有一行定义两个表之间的关联,如has_many Answer
和在 Answer 模型中:belongs_to Question
。
在表中,Questions
我有以下列:id
、title
和。subtitle
question_type
在Answers
表中我只有两列:question_id
和text
我在 _form.html.erb 中设置了表单,这样它将获得一个预定义的问题集(例如,问题 ID 1、2、5、6、11)。此外,表单将仅根据该设置动态创建表单所需的内容。以下代码是我这样做的:
(其中set
存储预定义问题集和与问题关联的答案的数组。每个问题都是一个 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 获取表单中的所有用户输入?
我正在考虑有多个相同类型的问题和一个问题的多个答案字段的情况。还是有比这更好的方法也能实现我想要的?
编辑:如果有帮助,这是由上述 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
来获取字段名称,但我似乎无法按照我想要的方式工作。任何帮助表示赞赏!