0

我有两个表Question,并且Answer在 Question 模型中有一行定义两个表之间的关联,如has_many Answer和在 Answer 模型中:belongs_to Question

在表中,Questions我有以下列:idtitle和。subtitlequestion_type

Answers表中我只有两列:question_idtext

我在 _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来获取字段名称,但我似乎无法按照我想要的方式工作。任何帮助表示赞赏!

4

1 回答 1

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

也许我错过了问题的全部要点。

于 2013-07-28T02:48:16.240 回答