2013-05-02 12 views
10

Obecnie próbuję utworzyć formularz dla modelu, który ma dynamiczną liczbę modeli zagnieżdżonych. Używam zagnieżdżonych formularzy (jak opisano w RailsCasts 197). Aby jeszcze bardziej skomplikować, każdy z moich modeli zagnieżdżonych ma skojarzenie has_one z trzecim modelem, który również chciałbym dodać do formularza.has_many zagnieżdżony formularz z formularzem zagnieżdżonym has_one w nim

Dla każdego, kto zastanawia się nad normalizacją lub niewłaściwym podejściem, ten przykład jest uproszczoną wersją problemu, z którym się borykam. W rzeczywistości sprawy są nieco bardziej złożone i takie podejście postanowiliśmy podjąć.

Niektóre przykładowy kod do zilustrowania problemu poniżej:

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

Kod ten przykład działa w pełni w pierwszej instancji pytanie. Problem występuje, gdy kolejne pytanie jest dynamicznie dodawane do utworzenia; pola odpowiedzi nie są wyświetlane. Uważam, że dzieje się tak dlatego, że są zbudowane tylko dla pierwszego pytania kontrolera. Czy istnieje sposób osiągnięcia tego przy użyciu nested_attributes?

+0

Dla osób, które natkną się na to pytanie: rozważ użycie gem nested_form z ryanb. Dostarczy Ci niesamowitych pomocników widoku link_to_add i link_to_remove. –

Odpowiedz

10

Rozwiązałem tutaj mój własny problem. Co zrobiłem było, zamiast budowania modelu odpowiedzi w regulatorze (co jest niemożliwe, jeśli nie wiem, jak wiele pytań, będą wykonane w widoku), zbudowałem go podczas wywoływania 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 %> 

Działa to, ponieważ niezależnie od tego, ile formularzy pytań jest budowanych na widoku, budowana jest nowa odpowiedź specyficzna dla budowanego pytania.

+1

Cieszę się, że to wymyśliłeś. Dziękujemy za przesłanie rozwiązania. –

Powiązane problemy