2013-07-27 57 views
0

我有兩個表格QuestionAnswer問題模型中有一行定義兩個表格之間的關聯爲has_many Answer,答案模型爲belongs_to QuestionRuby on Rails - 從自定義表格獲取用戶輸入

Questions表,我有以下欄目:idtitlesubtitlequestion_type

Answers表我只是有兩列:question_idtext

我設置在_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得到另一個變量字段名稱,但我似乎無法按照我想要的方式工作。任何幫助表示讚賞!

+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 

也許我錯過了整個問題的重點。