2013-05-02 21 views
10

Şu anda bir iç içe geçmiş model sayısı dinamik olan bir model için bir form oluşturmaya çalışıyorum. İç içe Formları kullanıyorum (RailsCasts 197'da açıklandığı gibi). İşleri daha da karmaşık hale getirmek için, iç içe geçmiş modellerimin her biri, formuna eklenmesini de istediğim üçüncü bir modelle bir has_one ilişkisine sahiptir.has_many iç içe form, içinde bir has_one iç içe form ile

Normalleştirme veya uygun olmayan bir yaklaşım hakkında merak edenler için bu örnek, karşılaştığım sorunun basitleştirilmiş bir sürümüdür. Gerçekte, işler biraz daha karmaşıktır ve bu, almaya karar verdiğimiz yaklaşımdır.

Bazı örnek kod

aşağıda sorunu göstermek için:

#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 %> 

Bu kod örneği Soru ilk örneği için tam çalışır. Sorun, oluşturulacak başka bir soru dinamik olarak eklendiğinde ortaya çıkar; cevap alanları görüntülenmiyor. Bunun, kontrolördeki ilk soru için oluşturulduğuna inanıyorum. Nested_attributes kullanarak bunu başarmanın bir yolu var mı?

+0

Bu soru hakkında yanıltan insanlar için: nested_form gem öğesini ryanb'den kullanmayı düşünün. Bu harika link_to_add ve link_to_remove görünüm yardımcıları sağlayacaktır. –

cevap

10

Burada kendi sorunumu çözdüm. fields_for çağrılırken oldu Yaptığım şey, bunun yerine (eğer birçok soru görünümünde yapılan olacak bilmiyorum zaman imkansız olan) denetleyicisi cevap modelini inşa etme, bunu inşa:

#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 %> 

Bu, görünüşe göre kaç tane soru formunun oluşturulup oluşturulmadığına bakılmaksızın oluşturulmakta olan soruya özel yeni bir cevap oluşturulduğu için çalışır.

+1

Bunu çözdüğüne sevindim. Çözümünüzü gönderdiğiniz için teşekkür ederiz. –