代码之家  ›  专栏  ›  技术社区  ›  Mostafa Hussein

无法正确提交表单值

  •  0
  • Mostafa Hussein  · 技术社区  · 11 年前

    我有一张表格,上面有问题和答案,它包含: student_id , survey_id , question_id , answer_id 。我希望每个表格都能保存与问题相同的记录。 我有两个问题:

    1-仅第一个属性( 学生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"}}}
    

    新的.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 回复  |  直到 11 年前
        1
  •  0
  •   Ruby Racer    11 年前

    我首先看到的一件事是你不需要 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
        ....