2013-07-10 13 views
11

Jestem nowy w Rails i zbudowany coś na podstawie tego, ale to potrzebne małe aktualizacje, aby był kompatybilny z szyn 4 za mocne parametry:niedozwolonej parametry dwukrotnie zagnieżdżonych modeli w szynach 4

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

i whitelisted parametry badania, pytania i odpowiedzi oparte na podobnym stanowisku tutaj:

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 

Pierwszy zagnieżdżonych modelu (pytanie) działa, ale drugi (Answer) zwraca błąd, kiedy złożyć główny formularz ankiety:

niedozwolona Parametry: 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 

Sprawdziłem bazę danych i ISN danych tam i znalazł błąd w dzienniku. Pierwszy zestaw zagnieżdżonych danych (pytania) jest tam i działa, to dopiero drugi następny, który nie jest. Mam również: id tam, że ludzie mówią, że potrzebujesz też.

O ile mi wiadomo, każdy rodzic musi dodać do białej listy atrybut zagnieżdżony, który zostanie zmodyfikowany. Użyłem dokładnie tego samego kodu, aby zadawać pytania, ale odpowiedzi nie są umieszczane na białej liście, mimo że zrobiłem to w pytaniach.

Wszelkie wskazówki są mile widziane. Nie mogę znaleźć żadnych podwójnie zagnieżdżonych przykładów do obejrzenia.

AKTUALIZACJA: Naprawiono problem metodą prób i błędów.

Dowiedziałem się, że biała lista musi pasować do zagnieżdżenia atrybutów. Tak aby rozwiązać powyższe zmieniłem to:

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

do tego:

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

Np po prostu skopiuj białą listę atrybutów odpowiedzi i umieść ją wewnątrz przed zamknięciem "]" dla atrybutów pytania.

+3

Powinno to być w * dokumentacji *. Nie wiem, dlaczego ktoś cię zawiódł. – SWoo

Odpowiedz

17

Dowiedziałem się, że biała lista musi pasować do zagnieżdżenia atrybutów. Tak aby rozwiązać powyższe zmieniłem to:

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

do tego:

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

Np po prostu skopiuj białą listę atrybutów odpowiedzi i umieść ją wewnątrz przed zamknięciem "]" dla atrybutów pytania.

Mam nadzieję, że pomoże to innym osobom z tym samym problemem.

Powiązane problemy