无法正确提交表单值

时间:2014-02-14 21:19:05

标签: ruby-on-rails forms nested-forms

我有一个有问题和答案的表格,它包含:student_idsurvey_idquestion_idanswer_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 %>

1 个答案:

答案 0 :(得分:0)

我首先看到的一件事是你的控制器中不需要survey["survey_id"]student["student_id"]。您已经映射了它们,并且您只需要分别surveystudent

另一方面,每个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
    ....