提前感谢您看我的问题。我是一个编程新手,正在努力解决将数据保存到"外表"的概念。
这是一个基本的调查。我有一个问题的列表,有属于它的答案。
下面是我遍历所有问题和答案的代码:
<% @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]" %>
在你的情况下,你有几个属于一些question
的answers
,原理是一样的,除了你必须为每个answer
建立特定的id,所以我强烈建议你这些非常有用的railscast
http://railscasts.com/episodes/197-nested-model-form-part-2
http://railscasts.com/episodes/75-complex-forms-part-3