Rails:FormBuilder 的高级用法

Rails: Advanced usage of FormBuilder

提问人:cjmj 提问时间:12/13/2015 最后编辑:cjmj 更新时间:12/13/2015 访问量:707

问:

我正在开发我们的 Web 应用程序,上周我的任务包括实现一个嵌套表单,该表单具有动态字段添加删除功能(来自关联的子模型)。请注意,该窗体实现了具有一对多关系的两个模型。我研究了它并发现了不同的方法,其中一些在没有 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” 的使用了。

jquery 表单 ruby-on-rails-4 unobtrusive-javascript

评论

0赞 Joe Half Face 12/13/2015
你不需要将构建器对象传递给 JQ,你使用 Javascript 加载部分,这是纯 HTML,因为 rails 用它来响应浏览器请求
0赞 cjmj 12/13/2015
Joe Half Face:删除已经存在且已填充的字段怎么样?

答:

-1赞 Jeiwan 12/13/2015 #1

有一个 gem 可以明确地完成您尝试实现的内容:https://github.com/nathanvda/cocoon

如果您想手动制作,请按以下计划:

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

  2. 充分利用 Rails 的嵌套属性——它允许您一次性创建父模型和子模型,或者调用父模型。createsave

  3. 因此,您需要在 JS 中创建 2 个按钮,一个用于添加一些新字段,另一个用于删除它们。只有 HTML,没有 AJAX 调用。

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

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

(注意任务没有 ids – Rails 会自动分配它们)

  1. 以上所有内容仅在模型具有 和Parenthas_many :childrenaccepts_nested_attributes_for :children

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

至于 Rails 文档,它相当不错,而且大部分都很全面。是的,没有人是完美的,可能会有一些差距,但没有什么比这个文档更好的了。你也可以参考 Rails 代码,但这比仅仅阅读文档要困难得多。