Rails 4中双嵌套模型的未允许参数

时间:2013-07-10 11:54:49

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

我是Rails的新手并基于此构建了一些东西,但它需要小的更新才能使其与Rails 4的强大参数兼容:

http://railscasts.com/episodes/196-nested-model-form-part-1

我根据类似的帖子将调查,问题和答案的参数列入白名单:

Rails 4 Nested Attributes Unpermitted Parameters

class Survey < ActiveRecord::Base
  has_many :questions, :dependent => :destroy
  accepts_nested_attributes_for :questions, allow_destroy: true
end

class Question < ActiveRecord::Base
  belongs_to :survey
  has_many :answers, :dependent => :destroy
  accepts_nested_attributes_for :answers, allow_destroy: true
end

class Answer < ActiveRecord::Base
  belongs_to :question
end

class SurveysController < ApplicationController
  def survey_params
    params.require(:survey).permit(:name, questions_attributes: [:id, :survey_id, :content])
  end

class QuestionsController < ApplicationController
  def question_params
    params.require(:question).permit(:survey_id, :content, answers_attributes: [:id, :question_id, :content])
  end

class AnswersController < ApplicationController
  def answer_params
    params.require(:answer).permit(:question_id, :content)
  end

第一个嵌套模型(问题)有效,但第二个(答案)在我提交主调查表时返回错误:

未经许可的参数:answers_attributes

Started POST "/surveys" for 127.0.0.1 at 2013-07-10 19:20:00 +0800
Processing by SurveysController#create as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"pCK7j73kJPmld6gMXtbnBcheHU3pb9FGdjbHJPX6leE=", "survey"=>{"name"=>"test", "questions_attributes"=>{"0"=>{"content"=>"bbb", "answers_attributes"=>{"0"=>{"content"=>"bbbb"}}}}}, "commit"=>"Create Survey"}
Unpermitted parameters: answers_attributes

我检查了数据库并且数据不存在,并在日志中发现错误。第一组嵌套数据(问题)在那里工作,它只是第二组不是。我也有:人们说你也需要那个ID。

据我所知,每个父母都需要将要修改的直接嵌套属性列入白名单。我使用完全相同的代码来解决问题,但即使我在问题中这样做,答案也不会被列入白名单。

任何指针都表示赞赏。我似乎无法找到任何双嵌套的例子。

更新:我通过反复试验解决了这个问题。

我发现修复是白名单需要匹配属性的嵌套。所以为了解决上述问题我改变了这个:

class SurveysController < ApplicationController
  def survey_params
    params.require(:survey).permit(:name, questions_attributes: [:id, :survey_id,    :content])
  end

到此:

class SurveysController < ApplicationController
  def survey_params
    params.require(:survey).permit(:name, questions_attributes: [:id, :survey_id,    :content, answers_attributes: [:id, :question_id, :content]])
  end

E.g。只需复制answers_attributes的白名单,然后将其插入到questions_attributes的结束“]”之前。

1 个答案:

答案 0 :(得分:17)

我发现修复是白名单需要匹配属性的嵌套。所以为了解决上述问题我改变了这个:

class SurveysController < ApplicationController
  def survey_params
    params.require(:survey).permit(:name, questions_attributes: [:id, :survey_id,    :content])
  end

到此:

class SurveysController < ApplicationController
  def survey_params
    params.require(:survey).permit(:name, questions_attributes: [:id, :survey_id,    :content, answers_attributes: [:id, :question_id, :content]])
  end

E.g。只需复制answers_attributes的白名单,然后将其插入到questions_attributes的结束“]”之前。

希望这可以帮助其他人解决同样的问题。