我正在尝试创建一个测验生成器,用户可以在其中构建添加到
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"} }
基本上,您将模型嵌套在 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 多,这在你编写的代码中很难发现......