tutorial software rails official guides framework ejemplos caracteristicas ruby-on-rails-4 strong-parameters

ruby on rails 4 - software - Parámetros no permitidos para modelos de doble anidación en Rails 4



ruby on rails tutorial (1)

Soy nuevo en Rails y construí algo basado en esto, pero necesitaba pequeñas actualizaciones para hacerlo compatible con los fuertes parámetros de Rails 4:

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

Incluí en la lista blanca los parámetros para la encuesta, preguntas y respuestas basadas en una publicación similar aquí:

Rieles 4 Atributos anidados Parámetros no permitidos

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

El primer modelo anidado (Pregunta) funciona, pero el segundo (Respuesta) devuelve un error cuando presento el formulario de encuesta principal:

Parámetros no permitidos: atributos_respuesta

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

Revisé la base de datos y los datos no estaban allí, y encontré el error en el registro. El primer conjunto de datos anidados (las preguntas) está ahí y funciona, solo el segundo que no lo está. También tengo la identificación aquí que la gente dice que tú también necesitas.

Hasta donde yo sé, cada padre necesita incluir en la lista blanca el atributo anidado directo que modificará. Usé exactamente el mismo código para hacer que las preguntas funcionen, pero las respuestas no se incluyen en la lista blanca aunque lo hice en las preguntas.

Cualquier puntero apreciado. Parece que no puedo encontrar ningún ejemplo anidado doble para mirar.

ACTUALIZACIÓN: arreglé el problema por prueba y error.

Descubrí que la solución es que la lista blanca debe coincidir con la anidación de los atributos. Entonces, para arreglar lo anterior, cambié esto:

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

a esto:

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

Por ejemplo, simplemente copie la lista blanca de los atributos de las respuestas e insértela dentro antes del cierre "]" para los atributos de la pregunta.


Descubrí que la solución es que la lista blanca debe coincidir con la anidación de los atributos. Entonces, para arreglar lo anterior, cambié esto:

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

a esto:

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

Por ejemplo, simplemente copie la lista blanca de los atributos de las respuestas e insértela dentro antes del cierre "]" para los atributos de la pregunta.

Espero que esto ayude a otros con el mismo problema.