has_many嵌套表单,其中包含has_one嵌套表单

我目前正在尝试为模型创建一个表单,该模型具有动态数量的嵌套模型。 我正在使用嵌套表单(如RailsCasts 197中所述 )。 为了使事情变得更复杂,我的每个嵌套模型都与第三个模型有一个has_one关联,我也希望将其添加到表单中。

对于任何想要过度规范化或不正确的方法的人来说,这个例子是我所面临的问题的简化版本。 实际上,事情稍微复杂一点,这就是我们决定采取的方法。

一些示例代码来说明下面的问题:

 #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                

此代码示例完全适用于Question的第一个实例。 当动态添加另一个问题时,会出现问题; 答案字段不会显示。 我相信这是因为它们只是为控制器中的第一个问题而构建的。 有没有办法使用nested_attributes实现这一目标?

我在这里解决了自己的问题。 我所做的是,而不是在控制器中构建答案模型(当你不知道在视图中会有多少问题时这是不可能的),我在调用fields_for时构建了它:

 #CONTROLLER class TestsController < ApplicationController #GET /tests/new def new @test = Test.new @questions = @test.questions.build 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, @questions.build_answer do |answers_builder| %> < %= answers_builder.label :answer %> < %= answers_builder.text_box :answer %> < % end %> < % end %> < %= link_to_add_fields 'New', f, :questions %> < % end %> 

这是有效的,因为无论在视图上构建了多少个问题表单,都会构建一个针对正在构建的问题的新答案。