我尝试用 rails3 中的nested_form gem 做一些好事。(我不能使用这个宝石,但看起来 rails3 总是需要一个宝石来做这件事......谷歌总是将我重定向到这个 gem 以获得 rails3 中的嵌套表单)
所以我有这个结构:
- 模型 1 has_many 模型 2 (, :d ependent => :nullify)
- 模型 1 has_many 模型 3 (, :d ependent => :nullify)
- 模型 2 belongs_to 模型 1
- 模型 2 belongs_to 模型 3
- accepts_nested_attributes_for :模型3, :限制 => 1
- attr_accessible :model3_attributes
- 模型3 has_many 模型2
- 模型3 belongs_to 模型1
这个想法是创建一个模型1,然后创建一个嵌套的模型2,在模型2的创建形式中,在列表中选择或创建一个新的模型3。
我搭建了很多东西,现在我正在寻找有关如何做到这一点的文档,但我需要帮助,因为 rails3 "猜测"了所有内容,所以我觉得我在没有真正的教程或示例的情况下添加东西,而不是做正确的事情。
现在:
- 如果我创建了一些 Model3,一切正常。 这是我的 Model2 表单: http://pastebin.com/6te9fSK8(它们出现在列表中,我选择它们)
- 现在我想拥有"新模型3"功能。所以我添加了nested_form宝石
- 我添加了这段代码 http://pastebin.com/nzqVzwzn
- 首先,在编辑的情况下,它"有效":我可以创建一个新的 model3,它将被添加到列表中并替换以前的模型。
- 但是,经过审查,每次我想添加一个新时,它都会替换我添加的旧版本。我看起来像一个JavaScript问题(我正在使用jQuery9)
- 如果我创建一个新模型1,然后创建一个嵌套模型2,则模型3列表为空。因此,即使我使用新字段添加新的 model3,表单也希望我从(空)列表中选择一个 model3。即使我从表单中删除列表,它仍在等待我选择一个模型3,并且不关心我添加的新模型3。(当我创建一个新的模型1时,我可以通过创建一个默认的模型3来绕过它,但它看起来像一个弱补丁......
除了 model2 之外,我没有触摸我的控制器,我在其中添加了一个受保护的方法以查找来自 :@model1 的model1_id
class Models2Controller < ApplicationController
before_filter :get_model1
...
protected
def get_model1
@model1 = Model1.find(params[:model1_id])
end
如果有人可以帮助我如何正确管理这个问题,那将非常有帮助。
谢谢
这是一个很长的问题,需要很长的答案。我建议您去观看196嵌套模型表单第1部分,197嵌套模型表单第2部分,也许还有更多,例如复杂表单。
通常,您可以通过在模型中accepts_nested_attributes_for :model
让任何模型创建任何其他模型的实例。因此,Model 1 将接受 Model 2,Model 2 将接受 Model3。在您的 Model2 中(我知道感觉您想将其放入控制器中,但不要)您可以有一个工厂方法,该方法将检查它是否获得了 Model3 实例的 ID,或者它是否获得了新 Model3 的属性并根据需要创建它......
上面的截屏视频将向您展示表单层次结构的方式,您需要针对您的情况编辑的唯一部分是最后一步是新模型或现有模型,但这不是您遇到麻烦的地方:)