2013-07-10 3 views
11

Я новичок в Rails и построил что-то на этом основании, но он нужен небольшие обновления, чтобы сделать его совместимым с Rails 4 в сильные параметры:Самовольная параметры для двойной вложенными моделей в 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 

Я проверил базу данных и ISN данных 't там, и нашел ошибку в журнале. Первый набор вложенных данных (вопросы) есть и работает, это только второй следующий, который не является. У меня также есть: 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 

Э.Г. просто скопируйте белый список атрибутов answer_attributes и вставьте его внутрь перед закрытием «]» для параметров question_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 

Э.Г. просто скопируйте белый список атрибутов answer_attributes и вставьте его внутрь перед закрытием «]» для параметров question_attributes.

Надеюсь, это поможет другим людям с той же проблемой.