2013-07-27 2 views
0

У меня есть две таблицы 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, чтобы получить имена полей, но я не могу работать так, как хочу. Любая помощь приветствуется!

+0

Не могли бы вы лучше объяснить, о чем вы думаете? возможно, с помощью примера псевдокода. – juanpastas

ответ

0

У вас есть несколько видов ресурсов. Насколько я понимаю, вы хотите сохранить несколько ответов. Я полагаю, это потому, что вы даете ответы на все вопросы, поэтому я полагаю, что вы НЕ в той части, где создаются вопросы и ответы.

Если это так, я хотел бы создать модель, которая сохраняет эту информацию, трудно назвать:

class Item < ActiveRecord:Base 
    belongs_to :question 
    belongs_to :answer 
end 

и модель в группу этих пунктов:

class Test < ActiveRecord::Base 
    belongs_to :user 
    has_many :items 

    accepts_nested_attributes_for :items 

    attr_accessible :items_attributes 
end 

Вы не упомянутый user.

Тогда моя форма будет что-то вроде:

<%= form_for @test do |test| %> 

    <%= test.fields_for :items do |item| %> 
    <%# Render question ----> your code %> 

    <%= item.hidden_field :question_id %> 
    <% end %> 
<% end %> 

Ваш контроллер:

class TestsController < ApplicationController 
    def new 
    @test = Test.new question_ids: params[:question_ids] 
    end 

    def create 
    @test = Test.new params[:test] 

    if @test.save 
     # success 
    else 
     # fail 
    end 
    end 
end 

Обратите внимание, что вы будете отправлять params[:question_ids] построить форму. Для этого необходимо:

class Test < ActiveRecord::Base 
    ... 
    attr_accessible :question_ids 

Возможно, я пропустил всю точку вопроса.

Смежные вопросы