或者创建一个表单并传回一个哈希值



提前感谢您看我的问题。我是一个编程新手,正在努力解决将数据保存到"外表"的概念。

这是一个基本的调查。我有一个问题的列表,有属于它的答案。

下面是我遍历所有问题和答案的代码:

<% @questions.each do |question| %>
<ul><%= question.questiondescription %></ul>
<% @answers = question.answers %>
<% @answers.each do |answer| %>
<li><%= answer.answerdescription %></li>
<% end %>
<% end %>

这个效果很好。然而,我希望所有的答案是单选按钮,并存储在另一个表的选择。我有另一个名为"assessment_results"的控制器和表。它看起来像这样:

User_Id, Assessment_Id, Question_ID, Answer_Id

我需要在这个表中为每个问题和答案创建一个新记录。把所有的问题都列在一页纸上,我该怎么做呢?

所以我的想法是,我需要一个哈希推入每个问题的表。{[user_id: 1 assessment_id: question_id: 1, answer_id: 3]}

您可以使用radio_button_tag并自己解析结果。

这是细目查看您的assessment_results表,我假设您有一个基于'assessment_id'列的评估控制器。

让我们用它来提出问题。

以下是评估/new.html.erb

<h1>New assessment</h1>
<%= form_for(@assessment) do |f| %>
  <% if @assessment.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(@assessment.errors.count, "error") %> prohibited this assessment from being saved:</h2>
      <ul>
      <% @assessment.errors.full_messages.each do |message| %>
        <li><%= message %></li>
      <% end %>
      </ul>
    </div>
  <% end %>
      <% @questions.each do |question| %>
        <%= question.questiondescription %>
        <ul>
          <% @answers = question.answers %>
          <% @answers.each do |answer| %>
            <li><%= answer.answerdescription %><%= radio_button_tag("questions[#{question.id}]", answer.id) %></li>
          <% end %>
        </ul>
      <% end %>
  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

我们有一个标准的评估表单,它给了我们表单结构和评估按钮,我们实际上不会使用它的任何东西。

最好先构建视图,然后在浏览器中查看源代码。

工作是由radio_button_tag完成的,第一个值"questions[#{question.id}]"

将为第一组问题生成名称为"questions[1]"的单选按钮,值将是答案id。

当rails看到像questions[1]这样的参数时,它会将其放入名为questions的散列中。

以下是提交表单并填写答案时日志中的原始散列:

Parameters: {"utf8"=>"✓", "authenticity_token"=>"lwqT5y+xUaYvt/GBObpN+BBO3F4YO8XaEGWcpS84lVw=", "questions"=>{"1"=>"2", "2"=>"8", "3"=>"13", "4"=>"18", "5"=>"23"}, "commit"=>"Create Assessment"}

问题散列是:

"questions"=>{"1"=>"2", "2"=>"8", "3"=>"13", "4"=>"18", "5"=>"23"}

现在,在评估控制器中,对于创建方法,我做了以下操作:

def create
  @assessment = Assessment.new(user_id: current_user.id)
  respond_to do |format|
    if @assessment.save
      params[:questions].each do |question, answer|
        AssessmentResult.create(user_id: current_user.id, assessment_id: @assessment.id,
          question_id: question, answer_id: answer)  
      end
      format.html { redirect_to @assessment, notice: 'Assessment was successfully created.' }
      format.json { render :show, status: :created, location: @assessment }
    else
      format.html { render :new }
      format.json { render json: @assessment.errors, status: :unprocessable_entity }
    end
  end
end

首先,我们创建一个属于用户的评估,我假设您正在使用设计或类似的系统,将current_user用于当前登录的用户。

使用@assessment保存后的下一步。保存,这给了我们@assessment。

评估结果将属于。

所以核心工作在这里发生:

params[:questions].each do |question, answer|
  AssessmentResult.create(user_id: current_user.id, assessment_id: @assessment.id
     question_id: question, answer_id: answer)  
  end
end

params[:questions] -这是表单提交的params问题散列。

params[:]的问题。每个do |question, answer| -这将获取哈希值,对于每个条目,将其分割为键和值,并使用|key, value|,在这种情况下,键是问题id,值是选择的答案id。

现在我们使用create命令将答案存储在AssessmentResult模型/表中。

假设您现在想显示评估的结果:/assessments/1/show

def show
  @assessment_results = AssessmentResult.where(assessment_id: @assessment.id)
end

现在您在AssessmentResult

中有了问题和选择的答案

确保在模型中设置了关系:应用程序/模型/assessment_result.rb

class AssessmentResult < ActiveRecord::Base
  belongs_to :question
  belongs_to :answer
end

简单显示问题和选择的答案,您必须自己添加"正确答案"代码。

app/views/评估/show.html.erb

<% @assessment_results.each do |ar| %>
  <%= ar.question.questiondescription %>: <%= ar.answer.answerdescription %>
  <br />
<% end %>

好的,当你有嵌套模型时,你可以这样做

<%=  form_for(@question) do |f| %>
    <%= f.fields_for :answer do |ff| %>
        <%= ff.label :image, 'Tag:' %>
        <%= ff.checkbox :description, multiple: true, name: "answer[description]" %>

在你的情况下,你有几个属于一些questionanswers,原理是一样的,除了你必须为每个answer建立特定的id,所以我强烈建议你这些非常有用的railscast

http://railscasts.com/episodes/197-nested-model-form-part-2
http://railscasts.com/episodes/75-complex-forms-part-3

最新更新