我正在开发我们的webapp,上周我的任务包括实现具有动态字段添加删除功能的嵌套表单(来自关联的子模型)。请注意,表单实现了两个具有一对多关系的模型。我研究了它并发现了不同的方法,其中一些添加/删除字段without js,其他人使用旧方式的js(rails 3或之前)。我跟着railscast-196和railscast-197,但解释的辅助方法不是不引人注目的方式,对吧? (因为它仍然在html中使用js)
我正在寻找一种通过jquery以不引人注目的方式实现添加/删除功能的方法。
逻辑上应该可以通过 - 发出ajax请求来构建嵌套模型的实例, - 通过jquery在服务器端构建响应, - 更新视图然后 - 将更新的视图发送回客户端。
问题: - 我面临的问题是将构建器对象传递给jquery。 期望: - 通过jquery
将两个自定义添加和删除字段功能绑定到视图中的按钮另外:您能否给我一个更深入的文档链接给FormBuilder?导致rubyonrails api无法解释。他们甚至不会说如果你使用form_builder.object,你将获得模型(明确地),让ryanb使用FormBuilder" f.object.class.reflect_on_association"。
答案 0 :(得分:-1)
有一颗宝石完全符合您的目标:https://github.com/nathanvda/cocoon
如果你想在这里手动制作计划:
您不需要发送AJAX请求来构建嵌套模型的实例(当用户单击添加新实例按钮并关闭浏览器选项卡时会发生什么?实例将保留在DB中)
充分利用Rails' nested attributes - 它允许您在一次移动中创建父模型和子模型,在父模型上进行一次create
或save
调用。
所以你需要在JS中做的就是创建2个按钮,一个添加一些新字段,另一个删除它们。只是HTML,没有AJAX调用。
要使用嵌套属性,在构建Parent.create
或save
的参数时必须遵守某些约定。通常,在创建模型时,将一些属性传递给create
方法,这些属性对应于模型的字段。当您使用嵌套属性时,您需要传递一个附加属性,该属性按以下方式形成:[children_relation_name]_attributes
。因此,如果您拥有Project
和Task
模型并且想要同时创建项目和任务,则需要像这样创建它们:
Project.create(名称:'项目1',tasks_attributes:[{name:'任务1'},{name:'任务2'}] )
(注意没有任务的ID - Rails会自动分配它们)
以上所有内容仅适用于Parent
模型has_many :children
和accepts_nested_attributes_for :children
所以你的任务就是构建包含children_attributes
param的正确参数,将此参数添加到强参数(如children_attributes: [:name, :age, ...]
)。您可以使用form_for
和fields_for
来构建表单,使用JS来正确地将字段放入此表单中,使用嵌套属性来同时创建父级和子级记录。这就是cocoon
宝石的作用。
至于Rails文档,它非常好,而且非常全面。是的,没有人是完美的,可能会有一些差距,但没有比这个文档更好的了。您也可以参考Rails代码,但它比阅读文档要困难得多。