【发布时间】:2011-04-03 06:15:32
【问题描述】:
我想要一个很好的资源,了解如何设置控制器操作和表单,以便在它所属的另一个资源的视图内创建资源......
【问题讨论】:
标签: ruby-on-rails ruby ruby-on-rails-3 controller associations
我想要一个很好的资源,了解如何设置控制器操作和表单,以便在它所属的另一个资源的视图内创建资源......
【问题讨论】:
标签: ruby-on-rails ruby ruby-on-rails-3 controller associations
像往常一样设置您的控制器。您需要使用 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/
【讨论】:
form_for 一个人,并且在该表单中,您将能够创建 x 个孩子。如果你的模型中有正常的关联和声明accepts_nested_attributes_for,这将创建你想要的结构。
person 变量在您的 setup_person 方法中定义在哪里?
我没有记录我通常做的事情的网络资源,但我创建了一个 gist 记录我最常在这里做的事情:https://gist.github.com/900241
要点的前提是你有一个项目模型有很多项目角色,并且你想在项目表单中编辑很多项目角色。这几乎是经典的accepts_nested_attributes_for 场景,几乎任何讨论它的页面都会给你一个不错的文章。问题是,我所看到的解决方案总是涉及一些非常混乱的突兀 JavaScript,这些 JavaScript 会逃脱整个表单视图并将其扔到链接的 onClick 方法中。我最近想出了一个使用 jQuery 模板的更简洁、不显眼的方法。
当您移动到嵌套模型时,您不必对 ProjectsController 做任何事情。一切都在控制器级别工作,您甚至不需要 ProjectRolesController。 (这就是为什么我没有费心将它们包括在要点中的原因。)在模型级别,它只是标准的accepts_nested_attributes_for。有趣的地方在视图中。
项目表单有两个 form_for 块:一个呈现 jQuery 模板,另一个呈现项目角色表单。反过来,jQuery 模板只是呈现项目角色表单(mmm DRY!),但来自 <script> 标记内,并且具有空白项目角色。因为表单在脚本标签内,它不会与项目表单一起提交,并且因为脚本类型是“text/x-jquery-tmpl”,所以这是完全有效的标记。
当用户单击“添加项目角色”时,它会触发一些 jQuery,该 jQuery 采用模板中的表单,将索引替换为当前日期(这一切都是为了可以唯一标识该项目角色),并附加它到表单的项目角色部分的末尾。
当用户单击项目角色旁边的“删除”时,它会检查该项目角色是否是新记录,如果不是,它会在表单末尾附加一个“_delete”隐藏字段。无论哪种情况,它都会从 DOM 中删除项目角色 div。
【讨论】: