我正在尝试使用rails创建一个灵活的数据库驱动表单系统,并且在根据方法生成实际表单时我遇到了一些麻烦。
我接近它的方法是使用一个模型作为表单索引(称之为MyForms
),这是一个处理所有表单问题的模型(称之为MyQuestions
)以及处理表单所有答案的模型(称之为MyAnswers
)。表单和问题已按以下方式存储到数据库中:
mysql> select * from my_forms;
+----+------------+---------+---------------------+---------------------+
| id | title | company | created_at | updated_at |
+----+------------+---------+---------------------+---------------------+
| 1 | First_Form | 1 | 2014-11-20 20:58:53 | 2014-11-20 20:58:53 |
+----+------------+---------+---------------------+---------------------+
mysql> select * from questions;
+----+--------------+-----------------+---------------+---------------------------------------------------------------------+---------------------+---------------------+
| id | my_form_id | question_number | question_type | the_question | created_at | updated_at |
+----+--------------+-----------------+---------------+---------------------------------------------------------------------+---------------------+---------------------+
| 1 | 1 | 1 | string | lorem ipsum dolor sit amet consectetuer adipiscing elit proin risus | 2014-11-20 21:27:04 | 2014-11-20 21:27:04 |
| 2 | 1 | 2 | radio | lorem ipsum dolor sit amet consectetuer adipiscing elit proin risus | 2014-11-20 21:27:04 | 2014-11-20 21:27:04 |
| 3 | 1 | 3 | check | lorem ipsum dolor sit amet consectetuer adipiscing elit proin risus | 2014-11-20 21:27:04 | 2014-11-20 21:27:04 |
| 4 | 1 | 4 | radio | lorem ipsum dolor sit amet consectetuer adipiscing elit proin risus | 2014-11-20 21:27:04 | 2014-11-20 21:27:04 |
| 5 | 1 | 5 | text-box | lorem ipsum dolor sit amet consectetuer adipiscing elit proin risus | 2014-11-20 21:27:04 | 2014-11-20 21:27:04 |
| 6 | 1 | 6 | string | lorem ipsum dolor sit amet consectetuer adipiscing elit proin risus | 2014-11-20 21:27:04 | 2014-11-20 21:27:04 |
| 7 | 1 | 7 | string | lorem ipsum dolor sit amet consectetuer adipiscing elit proin risus | 2014-11-20 21:27:04 | 2014-11-20 21:27:04 |
| 8 | 1 | 8 | text-box | lorem ipsum dolor sit amet consectetuer adipiscing elit proin risus | 2014-11-20 21:27:04 | 2014-11-20 21:27:04 |
| 9 | 1 | 9 | check | lorem ipsum dolor sit amet consectetuer adipiscing elit proin risus | 2014-11-20 21:27:04 | 2014-11-20 21:27:04 |
| 10 | 1 | 10 | check | lorem ipsum dolor sit amet consectetuer adipiscing elit proin risus | 2014-11-20 21:27:04 | 2014-11-20 21:27:04 |
+----+--------------+-----------------+---------------+---------------------------------------------------------------------+---------------------+---------------------+
答案数据库(当前为空)的结构如下:
mysql> show columns in answers;
+-----------------+----------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------------+----------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| question_id | int(11) | YES | MUL | NULL | |
| user_id | int(11) | YES | | NULL | |
| question_number | int(11) | YES | | NULL | |
| the_answer | text | YES | | NULL | |
| created_at | datetime | YES | | NULL | |
| updated_at | datetime | YES | | NULL | |
+-----------------+----------+------+-----+---------+----------------+
通过这种方式,无论我想发布多少表格,问题/表格或其他任何要求,我都能以最小的麻烦运行它们。
现在,我可以使用show
中的legal_forms_controller.rb
使用以下内容轻松地显示问题:
def show
@legalform = LegalForm.find(params[:id])
@questions = @legalform.questions
end
然后将其显示在show.html.erb
中,如下所示
<% @questions.each do |client| %>
<span><%= client.the_question %></span><br/>
<% end %>
但我正在努力弄清楚如何将这些与表单输入字段配对并将它们保存到答案数据库中。我认为得到一个空白的答案可能涉及创建一个答案控制器,然后使用new
方法,然后我可以使用一些条件在视图中创建正确的输入类型,给定question type
。但是,我不太清楚如何有效地创建此表单,然后在给定此方法的情况下保存数据。任何有关这方面的帮助将不胜感激。 (当然是“善良的上帝,为什么你这样做,你应该做......”的反应也是可以接受的。)
答案 0 :(得分:0)
我会将其建模为:
# column :label, TEXT - the text body of the question
# column :input_type, VARCHAR - maps to html input types
# ...
class Question
has_many :answers # since there may be several acceptable answers or options
end
# column :is_correct, BOOL
# column :text, TEXT
class Answer
belongs_to :question
end
# Or test
class Test
has_many :questions
has_many :test_scores
# generate a test with random questions
def self.random(seed = nil)
# ...
end
end
class TestScore
belongs_to :user
belongs_to :test
end
这使我们可以在test
&amp; user
(假设您有某种用户模型)。
您还可以构建允许管理员创建测试,问题和答案的用户界面。
要管理测试,您可以使用TestScoreController:
class TestScoreController
# administer a test
def new
@score = TestScore.new(user_id: current_user)
@score.test = @test = Test.random()
end
# corrects test
def create
# ...
end
# Show a test result
def show
@score = TestScore.find(params[:id]).joins(:test)
end
end
视图:new.html.erb
<%= form_for(@score) do %>
<%= @test.questions.each do |q| %>
<%= f.fields_for :questions, question do |q| -%>
<%= f.label q.label %>
<%= QuestionHelper.input(q) %>
<%= q.hidden_field :test_score_id, @score.id %>
<%= end %>
<%= end %>
<%= end %>
然后,您将创建一个辅助方法,该方法接受一个问题并返回输入。我建议simple_form,因为它有一个DSL,可以快速动态生成输入。
# app/helpers/question_helper
module QuestionHelper
def self.input(question)
case question.input_type.to_sym
when :text
when :radio_button
# ..
end
end
end