10

我目前正在尝试为模型制作一个表格,该表格具有动态数量的嵌套模型。我正在使用嵌套表单(如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 %>

此代码示例完全适用于 Question 的第一个实例。当另一个问题被动态添加以创建时,就会出现此问题;不显示答案字段。我相信这是因为它们只是为控制器中的第一个问题而构建的。有没有办法使用nested_attributes 来实现这一点?

4

1 回答 1

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

这是有效的,因为无论视图上构建了多少问题表单,都会构建特定于正在构建的问题的新答案。

于 2013-05-02T19:51:57.597 回答