我有兩個表格Question
和Answer
問題模型中有一行定義兩個表格之間的關聯爲has_many Answer
,答案模型爲belongs_to Question
。Ruby on Rails - 從自定義表格獲取用戶輸入
在Questions
表,我有以下欄目:id
,title
,subtitle
和question_type
。
在Answers
表我只是有兩列:question_id
和text
我設置在_form.html.erb這樣,它會得到一個預定義的問題集的形式(因此,例如,問題編號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來獲得在表單中的所有用戶輸入?
我在考慮一個問題存在多個相同類型和多個答案字段的問題。還是有更好的方式比這還能達到我想要的?
編輯:這是上面的紅寶石嵌入代碼生成的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
得到另一個變量字段名稱,但我似乎無法按照我想要的方式工作。任何幫助表示讚賞!
你能解釋一下你在想什麼嗎?也許是由一個僞代碼示例。 – juanpastas