我目前正在尝试为一个模型制作一个表单,该模型具有动态数量的嵌套模型。我正在使用嵌套表单(如 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 %>
此代码示例完全适用于问题的第一个实例。当动态添加要创建的另一个问题时会出现此问题;不显示答案字段。我相信这是因为它们只是为 Controller 中的第一个问题而构建的。有没有办法使用 nested_attributes 来实现这一点?
最佳答案
我在这里解决了我自己的问题。我所做的是,我没有在 Controller 中构建答案模型(当您不知道 View 中将提出多少问题时这是不可能的),我在调用 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 %>
这是有效的,因为无论在 View 上构建了多少问题表单,都会构建特定于正在构建的问题的新答案。
关于ruby-on-rails - has_many 嵌套表单,其中包含 has_one 嵌套表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16342210/