2013-07-10 68 views
11

我是新来的Rails和建造在此基础上的东西,但它需要小的更新,使其与导轨兼容4强大的参数:未经许可参数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 

我检查了数据库和数据ISN在那里,并发现日志中的错误。第一组嵌套数据(问题)在那里并且正在工作,只是第二个嵌套数据没有。我也有:身份证在那里人们说你也需要。

据我所知,每个家长都需要将它将修改的直接嵌套属性列入白名单。我使用完全相同的代码来解答问题,但答案并未被列入白名单,即使我已经在提问中这样做了。

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

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

我发现解决方法是白名单需要匹配属性的嵌套。因此,要解决上述我改变了这一点:

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中即可。

+3

这应该在*文档*中。不知道为什么有人低估你。 – SWoo

回答

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 

例如只需复制answers_attributes的白名单并在关闭“]”之前将其插入到questions_attributes中即可。

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