我正在构建问卷调查应用。 现在我有3个模特
1- Exam -> has_many :questions
2- Question -> has_many :answers && belongs_to :exam
class QuestionsController < ApplicationController
def index
@questions = Question.all
end
def show
exam = Exam.find(params[:exam_id])
@question = exam.questions.find(params[:id])
end
def new
exam = Exam.find(params[:exam_id])
@question = exam.questions.build
@question = Question.new
@question.answers.build
end
def create
exam = Exam.find(params[:exam_id])
@question = exam.questions.create(question_params)
if @question.save
redirect_to @question.exam, notice: "Exam created!"
else
render :new
end
end
def destroy
@question = Question.find(params[:id])
@question.destroy
redirect_to @question.exam
end
private
def question_params
params.require(:question).permit(:title,:timer,:exam_id,answers_attributes:[:title,:correct, :question_id], :sort => [])
end
end
3- Answer -> belongs_to :question
我可以添加考试,并在考试中添加问题并为每个问题添加答案。 (通过嵌套形式)
所以现在管理员是唯一可以添加考试,问题和答案的用户。我想让其他用户看到考试,以便可以参加考试并查看结果。
我考虑过制作属于考试的第4个提交模型,用户可以通过选项查看问题并选择他们想要的选项并提交。提交后,如果通过考试,他们会得到一个包含结果的页面!
但是如何做到?
UPDATE !!! 上面的代码工作正常!我只搜索某种方式让考试可见或可以为用户执行
<%= form_for [@exam, @submission] do |f| %>
<% @questions.each do |question| %>
<p><%= question.title %></p>
<ul>
<% question.answers.each do |answer| %>
<li>
<%= @chosen_option = answer.title %>
<%= f.fields_for :option do |o| %>
<%= render 'option_fields', :f => o %>
<% end %>
</li>
<% end %>
</ul>
<% end %>
<br>
<br>
<%= f.hidden_field :user_id, :value => current_user.id %>
<%= f.submit "Submit", class: "btn btn-primary " %>
<% end %>
答案 0 :(得分:0)
首先,您需要在模型上进行更多工作。
我假设每个问题至少有一个正确答案(除非您正在构建调查工具)。如果是这种情况,您还需要将正确答案的概念封装在模型中。
案例1:每个问题单个正确答案
在问题模型中添加correct_answer_id
。
案例2:每个问题多个正确答案 如果问题可以有多个正确答案,则需要创建连接表/模型
# migration for model CorrectAnswer
create_table :correct_answers do |t|
t.integer question_id
t.integer answer_id #answer_id is the id of the answer selected by a user
end
# Also update the Question class
class Question < ActiveRecord::Base
...
has_many :correct_answers
...
end
注意:即使您计划一个正确的答案,我也会推荐第二个选项。这将使您的模型能够灵活地满足任何未来的需求。
要创建提交,您需要创建一个名为Submission
的新模型。提交模型的字段包含以下字段
#migration for Submission model
create_table :submissions do |t|
t.integer user_id
t.integer exam_id
t.integer question_id
t.integer answer_id
end
您需要创建相应的提交控制器,以便非管理员用户提交考试答案。
不要忘记为表格创建适当的索引
答案 1 :(得分:0)
所以,我已经通过改变问题模型解决了这个问题。 我在问题模型中添加了一个答案数组
create_table "questions", force: :cascade do |t|
t.string "answers", default: [], array: true
end
在提交形式的视角中也改变了一些内容
<% question.answers.each_with_index do |answer, index| %>
<p><%= answer %><span>
<%= radio_button_tag 'submission[answers][]',"#{answer}", id: "#{answer}", class: "form-control"%>
</span></p>
<% end %>
现在的问题是我得到这样的问题 radio_button 我只能选择一个单选按钮!因此,如果我从问题1中选择answer_A然后从问题2中选择answer_B,那么问题1将被取消选择?