Rails 4 - 未允许的参数 - 深层嵌套的属性不保存

时间:2014-12-02 06:40:25

标签: ruby-on-rails ruby-on-rails-4 nested-forms strong-parameters

我正在处理深层嵌套的属性并遇到此未经许可的属性错误。

日志:

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 %>

1 个答案:

答案 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