我正在处理深层嵌套的属性并遇到此未经许可的属性错误。
日志:
Started POST "/videos/1/quizzes"
Processing by QuizzesController#create as HTML
Parameters: {"utf8"=>"✓",
"authenticity_token"=>"XdJ5lPZ7QuVEZiVYbphnV0T/NpMMTKVaL2dcWRxHVQU=",
"quiz"=>{"name"=>"Test",
"question"=>{"content"=>"Test",
"answer"=>{"content"=>"Test"}}}, "commit"=>"Submit", "video_id"=>"1"}
Video Load (0.1ms) SELECT "videos".* FROM "videos" WHERE "videos"."id" = ? LIMIT 1 [["id", 1]]
Unpermitted parameters: question
因此提交了所有数据。从阅读开始,看起来嵌套的问题参数应该是" question_attributes" =>但是在我的日志中它只显示" question" =>。我不知道这是否与它有关?但在这一点上,它确实是我唯一的想法。
测验#新:
def new
@video = Video.find(params[:video_id])
@quiz = @video.build_quiz
@quiz.questions.build
@quiz.questions.each do |question|
question.answers.build
end
end
video_id参数正在运行,如您所见,它正在提交。
测验#创建
def create
@video = Video.find(params[:video_id])
@quiz = @video.create_quiz(quiz_params)
respond_to do |format|
if @quiz.save
format.html { redirect_to @quiz, notice: 'quiz was successfully created.' }
format.json { render :show, status: :created, location: @quiz }
else
format.html { render :new }
format.json { render json: @quiz.errors, status: :unprocessable_entity }
end
end
end
quizzes_params
def quiz_params
params.require(:quiz).permit(:name, questions_attributes: [:id, :content, :quiz_id, answers_attributes: [:id, :content, :question_id]])
end
因此,您可以看到它停止了问题参数和答案参数的保存。
如果您还有其他需要,请告诉我!提前感谢您的帮助!
更新
这是形式偏!
我也尝试过form_for @quiz do |f|
,但这并没有改变提交的内容。
我试过的另一件事是将:question
和:answer
分为:questions
和:answers
,但没有运气。
<%= form_for [@video, @quiz] do |f| %>
<%= f.label :name, "Title" %>
<%= f.text_field :name %>
<%= f.fields_for :question do |questions| %>
<%= questions.label :content, "Question" %><br>
<%= questions.text_area :content, rows: 3 %>
<%= questions.fields_for :answer do |answers| %>
<%= answers.label :content, "Answer" %>
<%= answers.text_field :content %>
<% end %>
<% end %>
<%= f.submit "Submit" %>
<% end %>
答案 0 :(得分:0)
<强>解决方案:强>
我将quizzes_controller中的这一行从@quiz.questions.build
更改为2.times { @quiz.questions.build }
并解决了问题。不确定为什么它现在有效,但确实如此。任何解释为什么会非常感激!
def new
@video = Video.find(params[:video_id])
@quiz = @video.build_quiz
2.times { @quiz.questions.build }
@quiz.questions.each do |question|
question.answers.build
end
end