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.