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

Для людей, которые спотыкаются на этот вопрос: рассмотрите возможность использования драгоценного камня nested_form от ryanb. Он предоставит вам потрясающие ссылки 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

Рад, что вы поняли это. Спасибо, что опубликовали ваше решение. –

Смежные вопросы