ruby-on-rails - has_many 嵌套表单,其中包含 has_one 嵌套表单

标签 ruby-on-rails ruby nested-forms nested-attributes

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

相关文章:

ruby-on-rails - 设计错误未定义方法 `email'

ruby-on-rails - 如何配置oauth回调的路由

c - 我的嵌套结构声明有问题吗?

ruby-on-rails - Rails 4 嵌套形式和强参数

ruby-on-rails - inverse_of 在 after_initialize 内不起作用

ruby-on-rails - 你如何进行 "nest"或 "group"Test::Unit 测试?

ruby-on-rails - Rails 3 中相关表和模型的正确命名约定是什么

javascript - Ruby on Rails - 同一数据有两个不同的过滤器

ruby-on-rails - 在 after_save_filter 中生成 CSV 时未定义方法 'column_names'

ruby-on-rails - 如何在父模型的验证错误后显示嵌套表单验证错误?