0

我尝试用 rails3 中的 nested_form gem 做一些好事。(我不能使用这个 gem,但看起来 rails3 总是需要一个 gem 来做这些事情......而且谷歌总是将我重定向到这个 gem 以获取 rails3 中的嵌套表单)

所以我有这个架构:

  • Model1 has_many Model2 (, :dependent => :nullify)
  • Model1 has_many Model3 (, :dependent => :nullify)
  • 模型 2 属于模型 1
  • Model2 属于 Model3
    • 接受_嵌套属性_for :model3, :limit => 1
    • attr_accessible :model3_attributes
  • Model3 has_many Model2
  • Model3 属于 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. 如果我创建一个新模型 1,然后创建一个嵌套模型 2,模型 3 列表为空。因此,即使我添加了一个带有新字段的新模型 3,表单也希望我从(空)列表中选择一个模型 3。即使我从表单中删除列表,它仍在等待我选择一个模型 3 并且不关心我添加的新模型 3。(我可以通过在创建新模型 1 时创建默认模型 3 来绕过它,但它看起来像一个弱补丁......)

我没有接触我的控制器,除了 model2 我添加了一个受保护的方法来从 :model1_id 找到 @model1

  class Models2Controller < ApplicationController
      before_filter :get_model1

      ...
      protected
      def get_model1
        @model1 = Model1.find(params[:model1_id])
      end

如果有人可以帮助我正确管理此问题,那将非常有帮助。

谢谢

4

1 回答 1

1

这是一个很长的问题,需要很长的答案。我建议你去看196 Nested Model Form part1197 Nested Model Form part2,也许还有更多,比如 Complex form 。

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

上面的截屏视频将向您展示表单层次结构的方式,您需要针对您的情况进行编辑的唯一部分是最后一步是新模型或现有模型,但这不是您遇到的问题无论如何:)

于 2013-01-28T12:00:49.103 回答