2011-04-03 69 views

回答

1

按照正常方式设置控制器。您需要使用Rails的嵌套属性功能。这使您可以在使用一个表单创建其父项的同时创建子对象。

This is my go-to link for nested attributes。如果您运行的是Ruby 1.9.2,则需要进行的唯一更改位于setup_person帮助程序中。 returning已被弃用,所以你可以把它改成:

def setup_person(person) 
    person.tap do |p| 
    p.children.build if p.children.empty? 
    end 
end 

在典型的Rails风格,这将仅仅使用标准的控制器为每个资源的工作

其他链接

http://weblog.rubyonrails.org/2009/1/26/nested-model-forms

http://jeffperrin.com/2009/06/04/rails-nested-forms-and-collection_select/

+0

这比嵌套资源要好吗? – 2011-04-03 06:51:44

+0

真的是一回事。在上面的例子中,你将有一个普通的'form_for'人,并且在这个表单中,你将能够创建x个孩子。假设你在你的模型中有正常的关联*和*声明'accep_nested_attributes_for',这将创建你想要的结构。 – 2011-04-03 06:53:28

+0

您的'setup_person'方法中定义的'person'变量在哪里? – 2011-04-03 06:54:46

0

我没有那个文档我通常做一个网页来源,但我创建了一个gist,其中记录我做什么最经常在这里:https://gist.github.com/900241


该要点的前提是,你有一个具有许多项目角色的项目模型,并且您想要编辑项目表单中的许多项目角色。这几乎是经典的accepts_nested_attributes_for情况,几乎任何讨论它的页面都会给你一个体面的写作。问题是,我见过的解决方案总是涉及到一些严重杂乱的强大的JavaScript,它们逃脱了整个表单视图,并将它扔到链接的onClick方法中。我最近想出了一个使用jQuery模板的更简洁清晰的方法。

当您移动到嵌套模型时,您无需对您的ProjectsController执行任何操作。一切正常在控制器级别工作,并且您甚至不需要ProjectRolesController。 (这就是为什么我不打扰他们的要点。)在模型层面,这只是标准的accepts_nested_attributes_for。它在哪里变得有趣。

该项目形式有两个form_for块:一个呈现jQuery模板,另一个呈现项目角色形式。 jQuery模板反过来只是呈现项目角色形式(mmm DRY!),但是来自<script>标记,并且具有空白项目角色。由于表单在脚本标记内,因此不会与项目表单一起提交,并且因为脚本类型为“text/x-jquery-tmpl”,所以这是完全有效的标记。

当用户点击“添加项目角色”时,它会触发一些jQuery,它会在模板中使用表单,用当前日期替换索引(这是唯一可以识别的项目角色),以及将其附加到表单的项目角色部分的末尾。

当用户点击项目角色旁边的“删除”时,它会检查项目角色是否为新记录,如果不是,则会在表单末尾附加一个“_delete”隐藏字段。无论哪种情况,它都会从DOM中删除项目角色div。

+0

我知道罗宾已经把你和大多数受欢迎的文章关联起来......我仍然会推荐我的方法,它建立在这些其他方法中。这些旧文章中提到的JavaScript是我讨论的非常混乱的JavaScript。 – carpeliam 2011-04-03 07:14:45

相关问题