2013-07-10 3 views
11

Sono nuovo di Rails e costruito qualcosa sulla base di questo, ma aveva bisogno di aggiornamenti per renderlo compatibile con Rails parametri forti 4 di:parametri non consentito per i modelli a doppio annidati in Rails 4

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

ho whitelist i parametri per l'indagine, domande e risposte sulla base di un post simile qui:

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 

Il primo modello nidificato (Domanda) funziona, ma il secondo (risposta) restituisce un errore quando presento il modulo per il sondaggio principale:

parametri non consentito: 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 

ho controllato il database e l'isn di dati ci sono, e ho trovato l'errore nel registro. Il primo set di dati annidati (le domande) sono lì e funzionano, è solo il secondo successivo che non lo è. Ho anche il: id in là che la gente dice che ne hai bisogno anche tu.

Per quanto ne so, ogni genitore ha bisogno di autorizzare l'attributo annidato diretto che modificherà. Ho usato esattamente lo stesso codice per far funzionare le domande, ma le risposte non sono state autorizzate anche se l'ho fatto nelle domande.

Qualsiasi suggerimento apprezzato. Non riesco a trovare esempi a doppio nidificato da guardare.

AGGIORNAMENTO: Ho risolto il problema per tentativi ed errori.

Ho scoperto che la whitelist deve corrispondere all'annidamento degli attributi. Quindi, per risolvere quanto sopra ho cambiato questo:

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

a questo:

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

Ad es copia semplicemente la whitelist degli answer_attributes e inseriscila all'interno prima della chiusura "]" per le domande_attributi.

+3

Questo dovrebbe essere nella * documentazione *. Non sono sicuro del motivo per cui qualcuno ti ha downvoted. – SWoo

risposta

17

Ho scoperto che la whitelist deve corrispondere all'annidamento degli attributi. Quindi, per risolvere quanto sopra ho cambiato questo:

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

a questo:

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

Ad es copia semplicemente la whitelist degli answer_attributes e inseriscila all'interno prima della chiusura "]" per le domande_attributi.

Speriamo che questo aiuti gli altri con lo stesso problema.