has_many forma anidada con has_one forma anidada dentro de ella
Actualmente estoy tratando de hacer un formulario para un modelo, que tiene un número dinámico de modelos anidados. Estoy usando formularios anidados (como se describe enRailsCasts 197). Para complicar aún más las cosas, cada uno de mis modelos anidados tiene unhas_one
asociación con un tercer modelo, que también me gustaría agregar al formulario.
Para cualquiera que se esté preguntando sobre la normalización o un enfoque inadecuado, este ejemplo es una versión simplificada del problema que estoy enfrentando. En realidad, las cosas son un poco más complejas, y este es el enfoque que hemos decidido adoptar.
Algún código de ejemplo para ilustrar el problema a continuación:
#MODELS
class Test
attr_accessible :test_name, :test_description, :questions_attributes
has_many :questions
accepts_nested_attributes_for :questions
end
class Question
attr_accessible :question, :answer_attributes
belongs_to :test
has_one :answer
accepts_nested_attributes_for :answer
end
class Answer
attr_accessible :answer
belongs_to :question
end
#CONTROLLER
class TestsController < ApplicationController
#GET /tests/new
def new
@test = Test.new
@questions = @test.questions.build
@answers = @questions.build_answer
end
end
#VIEW
<%= form_for @test do |f| %>
<%= f.label :test_name %>
<%= f.text_box :test_name %>
<%= f.label :test_description %>
<%= f.text_area :test_description %>
<%= f.fields_for :questions do |questions_builder| %>
<%= questions_builder.label :question %>
<%= questions_builder.text_box :question %>
<%= questions_builder.fields_for :answer do |answers_builder| %>
<%= answers_builder.label :answer %>
<%= answers_builder.text_box :answer %>
<% end %>
<% end %>
<%= link_to_add_fields 'New', f, :questions %>
<% end %>
Este ejemplo de código funciona completamente para la primera instancia de Question. El problema se produce cuando otra pregunta se agrega dinámicamente para ser creada; los campos de respuesta no se muestran. Creo que esto se debe a que solo están diseñados para la primera pregunta en el controlador. ¿Hay alguna manera de lograr esto usando atributos anidados?