如何让用户提交调查问卷应用程序的答案?

时间:2017-11-01 14:59:44

标签: ruby-on-rails ruby

我正在构建问卷调查应用。 现在我有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 %>

2 个答案:

答案 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将被取消选择?