2013-05-02 185 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