【发布时间】:2013-07-08 08:16:43
【问题描述】:
我是 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
例如只需复制 answers_attributes 的白名单并将其插入到 questions_attributes 的结束“]”之前。
【问题讨论】:
-
这应该在文档中。不知道为什么有人对你投了反对票。
标签: ruby-on-rails-4 strong-parameters