Rails 4 atributos nesteds no guardan

Parece que no puedo obtener atributos nesteds para guardar en la base de datos. Estoy usando Rails 4.

Aquí están mis modelos:

class Answer < ActiveRecord::Base belongs_to :question end class Question < ActiveRecord::Base has_many :answers belongs_to :survey accepts_nested_attributes_for :answers, allow_destroy: true end class Survey < ActiveRecord::Base has_many :questions validates_presence_of :name accepts_nested_attributes_for :questions end 

Aquí está el controlador:

 def create @survey = Survey.new(survey_params) respond_to do |format| if @survey.save format.html { redirect_to @survey, notice: 'Survey was successfully created.' } format.json { render action: 'show', status: :created, location: @survey } else format.html { render action: 'new' } format.json { render json: @survey.errors, status: :unprocessable_entity } end end end def survey_params params.require(:survey).permit(:name, questions_attributes:[:content, :id, :survey_id, answers_attributes:[:content, :id, :questions_id] ]) end 

Finalmente, aquí está la forma misma. He intentado usar f.fields_for y solo fields_for

   

prohibited this survey from being saved:


La encuesta guarda bien en la base de datos, poner las preguntas y respuestas no. He mirado todos los recursos que pude encontrar y parece que estoy haciendo esto correctamente, así que realmente me estoy volviendo loco.

Este ejemplo es solo un andamio rápido, así que tuve algo de código para pegar, pero parece que no puedo hacerlo funcionar en ningún otro lugar.

Edición: cambiando mi nueva acción a algo como esto :

 def new @survey = Survey.new @survey.questions.build end 

¡TRABAJÓ!

VEA LA RESPUESTA DE LOS PEGAMENTOS PARA SOLUCIONAR ESTO

Aquí está el nuevo formulario que estoy usando, pero solo estoy guardando el nombre de la encuesta

     

prohibited this survey from being saved:


Parece que estás usando el objeto constructor de formularios incorrecto. Cambia la sección de preguntas a algo como esto:

 <%= f.fields_for :question do |question_builder| %> <%= question_builder.label :content %> <%= question_builder.text_area :content %> <%= question_builder.fields_for :answer do |answer_builder| %> <%= answer_builder.label :content, "Answer" %> <%= answer_builder.text_field :content %> <% end %> <% end %> 

Originalmente, estaba usando el generador de formularios f en la línea f.fields_for :answers... , sin embargo, dado el código de su modelo, ya que es una Question que accepts_nested_attributes_for an Answer , simplemente intercambiamos el objeto del generador de formularios por el utilizado para la question sección.

Nota: Cambié los nombres de los objetos del constructor para mayor claridad.

Actualizar

Para construir una relación profundamente anidada como esta, tendrá que recorrer su asociación “construida” ( questions en este caso), e invocar la build nuevamente en su asociación has_many . Así que, dejando la respuesta de gabrielhilal, harías esto:

 def new @survey = Survey.new @survey.questions.build @survey.questions.each do |question| question.answers.build end end 

Tenga en cuenta que en su caso, dado que está creando explícitamente una sola pregunta, técnicamente puede hacer esto en lugar de hacerlo (en lugar del ciclo):

 @survey.questions.first.answers.build 

Descargo de responsabilidad: si hay una forma más limpia, más Rails-y de hacer esto, lamentablemente no me doy cuenta.

En tu controlador tienes questions_id :

 def survey_params params.require(:survey).permit(:name, questions_attributes: [ :content, :id, :survey_id, answers_attributes: [:content, :id, :questions_id] ] ) end 

¿Es eso un error tipográfico? También intente configurar action_on_unpermitted_parameters para :raise en su development.rb para ver si hay algún atributo que esté faltando en su método survey_params .

 # In case of unpermitted parameters in the controller raise error. config.action_controller.action_on_unpermitted_parameters = :raise 

Debe cambiar su new acción para incluir @survey.questions.build :

 def new @survey = Survey.new @survey.questions.build end 

Pero tu forma es incorrecta también. Cambia la question a questions

  <%= f.fields_for :questions do |builder| %> #questions <%= builder.label :content %> <%= builder.text_area :content %> 

Debes hacer lo mismo para las respuestas.