【问题标题】:Rails 4 - Unpermitted Paramaters - Deeply nested attributes form not savingRails 4 - 未经许可的参数 - 深度嵌套的属性形式不保存
【发布时间】:2014-12-02 06:40:24
【问题描述】:

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

日志:

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

【问题讨论】:

  • 您需要从提交表单的位置检查视图上的参数结构。
  • 请你的html文件,我想你一定是遗漏了一些东西,比如f.fields_for被写成fields_for,这就是为什么你的“question_attributes”变成了“question”
  • 好的,我添加了部分表单。
  • OP 值得一枚奖牌,因为它在现实生活中展示了如何允许具有强参数的深度嵌套属性。 SO、Rails 文档和 GitHub 上的示例都是关于嵌套到另一个对象的属性的。没有人谈论将三个嵌套在一起。我已经挠头好几个小时了!

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


【解决方案1】:

解决方案:

我将 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多