使用accepts_nested_attributes_for在rails中使用三级嵌套表单

时间:2009-08-03 05:45:41

标签: javascript ruby-on-rails ajax forms nested-forms

我一直在尝试在我的rails应用程序中使用accepts_nested_attributes_for实现动态多模型表单。我一直在关注显示2级实现的Eloy Duran的complex-forms example,但我一直在努力将其扩展到3个级别。对于3级表单,是否支持accepts_nested_attributes_for?谁能告诉我如何扩展示例应用程序?

我已经让第三级的javascript部分工作(并不总是因某种原因而工作),但是我无法保存第3级对象。它为每个属性传递的参数名称是:

 greatgrandparent[grandparent_attributes][0][parent_attributes][0][object_attributes][1249277008434][attribute] 

如果greatgrandparent是表单所用的对象,祖父母是第一级,父级是第二级,对象是第3级(我想要保存的那个)。

谢谢,我感谢任何指示。

2 个答案:

答案 0 :(得分:18)

我已更新我的complex-form-examples以使用Rails 2.3。有关深层嵌套模型的示例,请参阅deep branch

git clone git://github.com/ryanb/complex-form-examples.git
cd complex-form-examples
git checkout -b deep origin/deep
rake db:migrate
script/server

这是迄今为止我见过的最干净的解决方案。如果您发现任何错误或改进,请add an issue on GitHub

答案 1 :(得分:2)

首先感谢Ryan为您发布解决方案。 它在两级表单中的效果非常好,但我在更深层次的嵌套表单中使用它时遇到了问题。 如果我想将add_child_link放入另一个已添加的部分中,Firebug会给我一个javascript错误。似乎有一个逃避的错误。

我已经尝试通过向链接方法传递另一个选项来避免转义内部部分,但这在某种程度上不起作用。

def add_child_link(name, f, options)
  fields = new_child_fields(f, options)
  fields = escape_javascript(fields) unless options[:already_escaping] == true
  link_to_function name, %{
        var new_object_id = new Date().getTime();
        var html = jQuery("#{fields}".replace(/#{options[:index]}/g, new_object_id)).hide();
        html.appendTo(jQuery("#{options[:where]}")).show();
      }
end

有关于此的任何提示吗?

致以最诚挚的问候,

麦克