Rails:FormBuilder的高级用法

时间:2015-12-13 12:08:06

标签: jquery ruby-on-rails forms ruby-on-rails-4 unobtrusive-javascript

我正在开发我们的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"。

1 个答案:

答案 0 :(得分:-1)

有一颗宝石完全符合您的目标:https://github.com/nathanvda/cocoon

如果你想在这里手动制作计划:

  1. 您不需要发送AJAX请求来构建嵌套模型的实例(当用户单击添加新实例按钮并关闭浏览器选项卡时会发生什么?实例将保留在DB中)

  2. 充分利用Rails' nested attributes - 它允许您在一次移动中创建父模型和子模型,在父模型上进行一次createsave调用。

  3. 所以你需要在JS中做的就是创建2个按钮,一个添加一些新字段,另一个删除它们。只是HTML,没有AJAX调用。

  4. 要使用嵌套属性,在构建Parent.createsave的参数时必须遵守某些约定。通常,在创建模型时,将一些属性传递给create方法,这些属性对应于模型的字段。当您使用嵌套属性时,您需要传递一个附加属性,该属性按以下方式形成:[children_relation_name]_attributes。因此,如果您拥有ProjectTask模型并且想要同时创建项目和任务,则需要像这样创建它们:

    Project.create(名称:'项目1',tasks_attributes:[{name:'任务1'},{name:'任务2'}] )

  5. (注意没有任务的ID - Rails会自动分配它们)

    1. 以上所有内容仅适用于Parent模型has_many :childrenaccepts_nested_attributes_for :children

    2. 的情况
    3. 所以你的任务就是构建包含children_attributes param的正确参数,将此参数添加到强参数(如children_attributes: [:name, :age, ...])。您可以使用form_forfields_for来构建表单,使用JS来正确地将字段放入此表单中,使用嵌套属性来同时创建父级和子级记录。这就是cocoon宝石的作用。

    4. 至于Rails文档,它非常好,而且非常全面。是的,没有人是完美的,可能会有一些差距,但没有比这个文档更好的了。您也可以参考Rails代码,但它比阅读文档要困难得多。