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

前端之家收集整理的这篇文章主要介绍了ruby-on-rails – has_many嵌套表单,其中包含has_one嵌套表单前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在试图为一个模型制作一个表单,它具有动态数量的嵌套模型.我使用嵌套表单(如 RailsCasts 197所述).为了使事情变得更复杂,我的每个嵌套模型都有一个与第三个模型的has_one关联,我也希望将其添加到表单中.

对于任何想要超标准化或不正当的方法的人来说,这个例子是我面临的问题的简化版本.事实上,事情稍微复杂一些,这是我们决定采取的方法.

一些示例代码来说明下面的问题:

  1. #MODELS
  2. class Test
  3. attr_accessible :test_name,:test_description,:questions_attributes
  4. has_many :questions
  5. accepts_nested_attributes_for :questions
  6. end
  7.  
  8. class Question
  9. attr_accessible :question,:answer_attributes
  10. belongs_to :test
  11. has_one :answer
  12. accepts_nested_attributes_for :answer
  13. end
  14.  
  15. class Answer
  16. attr_accessible :answer
  17. belongs_to :question
  18. end
  19.  
  20. #CONTROLLER
  21. class TestsController < ApplicationController
  22.  
  23. #GET /tests/new
  24. def new
  25. @test = Test.new
  26. @questions = @test.questions.build
  27. @answers = @questions.build_answer
  28. end
  29.  
  30. end
  31.  
  32. #VIEW
  33. <%= form_for @test do |f| %>
  34. <%= f.label :test_name %>
  35. <%= f.text_Box :test_name %>
  36. <%= f.label :test_description %>
  37. <%= f.text_area :test_description %>
  38. <%= f.fields_for :questions do |questions_builder| %>
  39. <%= questions_builder.label :question %>
  40. <%= questions_builder.text_Box :question %>
  41. <%= questions_builder.fields_for :answer do |answers_builder| %>
  42. <%= answers_builder.label :answer %>
  43. <%= answers_builder.text_Box :answer %>
  44. <% end %>
  45. <% end %>
  46. <%= link_to_add_fields 'New',f,:questions %>
  47. <% end %>

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

解决方法

我在这里解决了自己的问题.我所做的是,而不是在控制器中构建答案模型(这是不可能的,当你不知道在视图中会出现多少问题)时,我在调用fields_for时构建它:
  1. #CONTROLLER
  2. class TestsController < ApplicationController
  3.  
  4. #GET /tests/new
  5. def new
  6. @test = Test.new
  7. @questions = @test.questions.build
  8. end
  9.  
  10. end
  11.  
  12. #VIEW
  13. <%= form_for @test do |f| %>
  14. <%= f.label :test_name %>
  15. <%= f.text_Box :test_name %>
  16. <%= f.label :test_description %>
  17. <%= f.text_area :test_description %>
  18. <%= f.fields_for :questions do |questions_builder| %>
  19. <%= questions_builder.label :question %>
  20. <%= questions_builder.text_Box :question %>
  21. <%= questions_builder.fields_for :answer,@questions.build_answer do |answers_builder| %>
  22. <%= answers_builder.label :answer %>
  23. <%= answers_builder.text_Box :answer %>
  24. <% end %>
  25. <% end %>
  26. <%= link_to_add_fields 'New',:questions %>
  27. <% end %>

这样做是因为无论正在建立多少个问题形式,构建了一个针对正在建立的问题的新答案.

猜你在找的Ruby相关文章