我有一个有问题和答案的表格,它包含:student_id
,survey_id
,question_id
,answer_id
。我希望每个表格应该保存记录等于问题。
我有两个问题:
1-我的创建操作中的第一个属性(student_id
)保存了0
值,其他属性保存为Null
2-表格提交2条额外记录。我当前的表格有3个问题,当我回答3个问题时,我在数据库中得到5条记录(第一条记录只有空值,除了student_id = 0
,其他记录所有属性为空值。
控制器:
def create
#student_id saved as 0 and the rest attributes saved as Null
#always save two extra records with null value even when i answer all questions
params[:subject_survey].each do |student, survey, question, answer|
@sv_sub = SubjectSurvey.create(student_id: student["student_id"],
survey_id: survey["survey_id"],
question_id: question,
answer_id: answer)
end
if @sv_sub.save
redirect_to surveys_path, notice: "Success."
else
render :new, notice: "Failed."
end
end
服务器日志:
#when answering three questions:
Started POST "/subject_surveys" for 127.0.0.1 at 2014-02-14 21:54:09 +0200
Processing by SubjectSurveysController#create as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"C8w1p+tQCTY25SJU5TGJcqCqRoUw1TvVBjEJgpjPMPc=", "subject_survey"=>{"student_id"=>"1", "survey_id"=>"1", "2"=>{"answer_id"=>"7"}, "3"=>{"answer_id"=>"14"}, "4"=>{"answer_id"=>"19"}}}
#when answering one question:
Started POST "/subject_surveys" for 127.0.0.1 at 2014-02-14 21:50:29 +0200
Processing by SubjectSurveysController#create as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"C8w1p+tQCTY25SJU5TGJcqCqRoUw1TvVBjEJgpjPMPc=", "subject_survey"=>{"student_id"=>"1", "survey_id"=>"1", "2"=>{"answer_id"=>"7"}}}
new.html.erb
<%= form_tag('/subject_surveys', method: :post, class: 'form-horizontal' ) do %>
<% q = 0 %>
<% Survey.find(1).questions.order("questions.id asc").each do |question| %>
<% q += 1%>
<%= hidden_field_tag 'subject_survey[student_id]', "#{current_user.student.id}" %>
<%= hidden_field_tag 'subject_survey[survey_id]', '1' %>
<h6>Q<%= q %>- <%= question.content %></h6>
<div class="clearfix"></div><div class="clearfix"></div>
<% if question.question_type == "#{Question::CHECK}" %>
<% question.answers.each do |answer| %>
<%= check_box_tag "subject_survey[#{question.id}][answer_id][]", "#{answer.id}" %>
<%= answer.content %>
<div class="clearfix"></div>
<% end %>
<% elsif question.question_type == "#{Question::RADIO}" %>
<% question.answers.each do |answer| %>
<%= radio_button_tag "subject_survey[#{question.id}][answer_id]", "#{answer.id}" %>
<%= answer.content %>
<div class="clearfix"></div>
<% end %>
<% end %>
<% if question.id == Survey.find(1).questions.order("questions.id asc").last.id %>
<br>
<% else %>
<hr style="border-top: 1px solid #000000;">
<% end %>
<% end %>
<div class="form-actions no-margin">
<%= submit_tag "Submit", class: "btn btn-info pull-right" %>
<div class="clearfix"></div>
</div>
<% end %>
答案 0 :(得分:0)
我首先看到的一件事是你的控制器中不需要survey["survey_id"]
和student["student_id"]
。您已经映射了它们,并且您只需要分别survey
和student
。
另一方面,每个question
都有一个分配给它的答案哈希。所以,你应该这样对待。
这意味着,在您的初始映射中
params[:subject_survey].each do |student, survey, question, answer|
最后一个论点(答案)没有位置。无论如何,这不是最合适的,所以请看下面。
此外,第三个参数,问题,有点模糊......它不作为“问题”传递,而是作为指向值的数字。你应该把它变成一个数组。
在您的表单中,更改此内容:
<%= check_box_tag "subject_survey[#{question.id}][answer_id][]", "#{answer.id}" %>
进入此(不需要告诉表单该值被标记为“answer_id”,你已经知道了,所以我们摆脱了[answer_id]
部分)
<%= check_box_tag "subject_survey[questions][#{question.id}]", "#{answer.id}" %>
然后,在你的控制器动作中
def create
params[:subject_survey][:questions].each do |question, answer|
@sv_sub = SubjectSurvey.create(
student_id: params[:subject_survey][:student_id],
survey_id: params[:subject_survey][:survey_id],
question_id: question,
answer_id: answer)
end
....