Rails3 nested_form并不是很清楚

时间:2013-01-28 11:47:22

标签: jquery ruby-on-rails-3 ruby-on-rails-3.2 nested-forms nested-attributes

我尝试使用rails3中的nested_form gem做一些不错的事情。 (我无法使用这个宝石,但看起来rails3总是需要一个宝石来做这些事情......而Google总是将我重定向到这个宝石,用于rails3中的嵌套表格)

所以我有这个架构:

  • Model1 has_many Model2(,:dependent =>:nullify)
  • Model1 has_many Model3(,:dependent =>:nullify)
  • Model2 belongs_to Model1
  • Model2 belongs_to Model3
    • accepts_nested_attributes_for:model3,:limit => 1
    • attr_accessible:model3_attributes
  • Model3 has_many Model2
  • Model3 belongs_to Model1

后台的想法是创建一个Model1,然后创建一个嵌套的Model2,并在Model2的创建形式中,在列表中选择或创建一个新的Model3。

我支持很多东西,现在我正在寻找关于如何做到这一点的文档,但我需要帮助,因为rails3“猜测”了所有内容,所以我觉得我没有真正的教程或示例而不是做对的。

目前:

  1. 如果我创建了一些Model3,一切都有效。这是我的Model2表单:http://pastebin.com/6te9fSK8(它们出现在列表中,我选择它们)
  2. 现在我想拥有“新模型3”功能。所以我添加了nested_form gem
  3. 我添加了此代码http://pastebin.com/nzqVzwzn
  4. 首先,在编辑的情况下,它“有效”:我可以创建一个新的模型3,它将被添加到列表中,并将取代之前的。
  5. 但是,经过审核,每次我想添加一个新的,它取代我添加的旧的。我看起来像一个JavaScript问题(我使用的是jQuery9)
  6. 如果我创建一个新的model1然后是一个嵌套的model2,那么model3列表为空。因此,即使我使用新字段添加新模型3,表单也希望从(空)列表中选择一个模型3。即使我从表单中删除列表它还在等待我选择一个model3而不关心我添加的新模型3。 (当我创建一个新的model1时,我可以通过创建一个默认的model3来绕过它,但它看起来像一个弱补丁...)
  7. 我没有触摸我的控制器,除了model2,我在其中添加了一个受保护的方法来查找@ model1:model1_id

      class Models2Controller < ApplicationController
          before_filter :get_model1
    
          ...
          protected
          def get_model1
            @model1 = Model1.find(params[:model1_id])
          end
    

    如果有人可以帮助我如何妥善管理,那将非常有帮助。

    谢谢

1 个答案:

答案 0 :(得分:1)

这是一个很长的问题,需要很长的答案。我建议你去观看196 Nested Model Form part1197 Nested Model Form part2few more,例如复杂的形式。

通常,您可以让任何模型通过在模型中使用accepts_nested_attributes_for :model来创建任何其他模型的实例。所以Model1会接受Model2而Model2会接受Model3。在你的Model2中(我知道你觉得你想把它放在控制器中,但不是)你可以有一个工厂方法来检查它是否有一个Model3实例的id或它是否有新Model3的属性并根据需要创建它......

上面的截屏视频将向您展示表单层次结构的方式,您需要编辑的唯一部分是最后一步是新模型还是现有模型,但这不是您的意思无论如何都遇到了麻烦:)