У меня есть две таблицы Question
и Answer
где в модели Вопроса есть линия, которая определяет связь между двумя таблицами, как has_many Answer
и в ответе модели: belongs_to Question
.Рубин на Rails - получение пользовательского ввода из пользовательской формы
В 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?
Я думаю о случаях, когда есть несколько вопросов одинаковых типов и нескольких полей ответа для одного вопроса. Или есть лучший способ, кроме этого, который также достигнет того, что я хочу?
EDIT: Вот код HTML, созданный вышеуказанным встроенным кодом ruby, если это помогает.
<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>
EDIT:
Я изменил код немного, так что теперь каждое поле, используя другое имя, а не все они были с тем же именем, если они обладают тем же свойством. Но имя зависит от идентификатора ответа, и если это текстовое поле, то это будет как идентификатор ответа, так и идентификатор вопроса.
Таким образом, я думаю, что, может быть, я могу просто использовать 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