Has_many вложенная форма с вложенной формой has_one внутри нее

В настоящее время я пытаюсь создать форму для модели, которая имеет динамическое число вложенных моделей. Я использую вложенные формы (как описано в RailsCasts 197). Чтобы сделать вещи еще более сложными, каждая из моих вложенных моделей имеет связь 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?

Ответ 1

Я решил свою проблему здесь. То, что я сделал, вместо того, чтобы строить модель ответа в контроллере (что невозможно, если вы не знаете, сколько вопросов будет сделано в представлении), я построил его, вызвав поля_файлы:

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

Это работает, потому что независимо от того, сколько форм вопроса строится на представлении, создается новый ответ, специфичный для построенного вопроса.