我想了解如何设置控制器操作和表单以在其所属的另一个资源的视图内创建资源的良好来源...
答案 0 :(得分: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/
答案 1 :(得分: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。