2013-05-02 16 views
10

現在、ネストされたモデルの動的番号を持つモデルのフォームを作成しようとしています。私は入れ子フォームを使用しています(RailsCasts 197で説明)。物事をさらに複雑にするために、それぞれのネストされたモデルは、has_oneという3番目のモデルとの関連付けを持っています。これもフォームに追加したいと思っています。has_oneネストされたフォームの中に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ビューヘルパーを提供します。 –

答えて

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

あなたはそれを理解してうれしいです。ソリューションを投稿していただきありがとうございます。 –

関連する問題