2013-05-02 131 views
10

我目前正在试图为一个模型,它有一个动态数量的嵌套模型的窗体。我正在使用嵌套表单(如RailsCasts 197中所述)。为了使事情更加复杂,我的每个嵌套模型都有一个与第三个模型的has_one关联,我还希望将其添加到表单中。has_many嵌套窗体中有一个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 
<%= 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 %> 

此代码示例一起完全发挥作用问题的第一个实例。当另一个问题被动态添加以创建时,会发生该问题;答案字段不显示。我相信这是因为它们只是为控制器中的第一个问题而建立的。有没有办法使用nested_attributes来实现这一点?

+0

对于绊倒在这个问题上的人:考虑使用ryanb的nested_form gem。它会为你提供很棒的link_to_add和link_to_remove视图助手。 – 2015-01-02 14:37:34

回答

10

我在这里解决了我自己的问题。我所做的,而不是建立在控制器中的答案模式(这是不可能的,当你不知道的许多问题将如何在视图中进行),我建立了它调用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 %> 

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

+1

很高兴你知道了。感谢您发布您的解决方案。 – 2013-05-02 19:54:45