Rails 中嵌套表单提交时出现不允许的参数错误

问题描述 投票:0回答:1

我正在尝试创建一个测验生成器,用户可以在其中构建添加到

Quiz
模型中的测验,问题位于
QuizQuestions
模型中,并在
AnswerChoices
模型中选择答案。

测验是主要控制器。在编辑页面中,用户可以添加新问题并选择答案选择类型。问题模型嵌套在测验模型下。然后答案模型嵌套在测验模型下。

但是,保存表单并不会将答案选择保存到数据库,并且会出现

unpermitted parameter
消息,但所有参数都是允许的,即使只有一个参数也会发生这种情况。

控制器看起来像:

def edit
        @quiz = Quiz.find(params[:id])

        @quiz_questions = @quiz.quiz_questions.all 
        
        @quiz.quiz_questions.build(quiz_params) unless @quiz.quiz_questions.present?

    end

    def update
        @quiz = Quiz.find(params[:id])
        @quiz_questions = @quiz.quiz_questions

        if @quiz.update(quiz_params)
            redirect_to edit_quiz_path, notice: "Successfully upated quiz"
        else
           redirect_to admin_path,  notice: "UNSUCCESSFULLY added quiz"
        
        end

    end
def quiz_params
    params.require(:quiz).permit(
        :quiz_name,
         quiz_questions_attributes: [:id, :question, :quiz_id],
         quiz_answers_attributes: [:id, :question_id]
         
    
    )
end

模型(在不同文件中):

class Quiz < ApplicationRecord

    #Associations
    has_many :quiz_questions, foreign_key: :quiz_id
    accepts_nested_attributes_for :quiz_questions

end

class QuizQuestion < ApplicationRecord


    #ASSOCIATIONS
    belongs_to :quiz, foreign_key: :quiz_id

    has_many :quiz_answers, foreign_key: :question_id

    accepts_nested_attributes_for :quiz_answers, allow_destroy: true

end

class QuizAnswer < ApplicationRecord

    #Associations
        belongs_to :quiz_question, foreign_key: :question_id
        
end

测验/edit.html.erb

<div >
        <%= form_with model: @quiz do |newQuiz| %>

        <div >

              <h3> <%= newQuiz.label :quiz_name, "QUIZ: " %></h3>

              <%= newQuiz.text_field :quiz_name, %>
            
        </div>
                               

        <%= newQuiz.fields_for :quiz_questions do |questionData| %>

                    
            <div>
                <h3> <%= questionData.label :question, "Question" %></h3>
                <%= questionData.text_field :question %>
            </div>


            <%= questionData.hidden_field :quiz_id, value: 1 %>


            <%= newQuiz.fields_for :quiz_answers do |answerData| %>

                <%= answerData.text_field :id %>


                <%= answerData.hidden_field :question_id, value: 1 %>
                
            
             <% end %>
                   
        <% end %>
                

    </div>
        <%= newQuiz.submit "SAVE" %>
    <% end %>
</div>

错误提示:

Unpermitted parameter: :quiz_answers. Context: { controller: QuizzesController, action: update, request: #<ActionDispatch::Request:...>, params: {"_method"=>"patch", "authenticity_token"=>"[FILTERED]", "quiz"=>{"quiz_name"=>"Test Quiz 1", "quiz_questions_attributes"=>{"0"=>{"question"=>"This is a test question?", "quiz_id" => "1", "id"=>"1"}}, "quiz_answers"=>{"id"=>"1", "question_id"=>"1"}}, "commit"=>"SAVE", "controller"=>"quizzes", "action"=>"update", "id"=>"1"} }
ruby-on-rails forms model-view-controller nested-attributes model-associations
1个回答
0
投票

基本上,您将模型嵌套在 3 个级别中(A

Quiz
包含多个
QuizQuestion
,而
QuizQuestion
包含多个
QuizAnswer

因此,要使用

accepts_nested_attributes
选项,您的输入参数也应该相应地嵌套,例如你的
quiz_params
应该看起来像

def quiz_params
    params.require(:quiz).permit(
        :quiz_name,
         quiz_questions_attributes: [
           :id,
           :question,
           :quiz_id,
           quiz_answers_attributes: [:id, :question_id]
        ],
    )
end

应该相应地构建视图,您有一些输入字段用于用户输入的每个问题的答案,例如

<div>
  <%= form_with model: @quiz do |newQuiz| %>
    <div>
      <h3> <%= newQuiz.label :quiz_name, "QUIZ: " %></h3>
      <%= newQuiz.text_field :quiz_name, %>
    </div>

    <%= newQuiz.fields_for :quiz_questions do |questionData| %>
      <div>
        <h3> <%= questionData.label :question, "Question" %></h3>
        <%= questionData.text_field :question %>
      </div>
      <%= questionData.hidden_field :quiz_id, value: 1 %>
      
      <%= questionData.fields_for :quiz_answers do |answerData| %>
        <%= answerData.text_field :id %>
        <%= answerData.hidden_field :question_id, value: 1 %>
      <% end %>
    <% end %>
    <%= newQuiz.submit "SAVE" %>
  <% end %>
</div>

顺便说一句,你应该对格式进行一些处理,实际上你关闭的 div 比打开的 div 多,这在你编写的代码中很难发现......

© www.soinside.com 2019 - 2024. All rights reserved.