提问人:cjmj 提问时间:12/13/2015 最后编辑:cjmj 更新时间:12/13/2015 访问量:707
Rails:FormBuilder 的高级用法
Rails: Advanced usage of FormBuilder
问:
我正在开发我们的 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” 的使用了。
答:
有一个 gem 可以明确地完成您尝试实现的内容:https://github.com/nathanvda/cocoon
如果您想手动制作,请按以下计划:
您无需发送 AJAX 请求即可构建嵌套模型的实例(当用户单击“添加新实例”按钮并关闭浏览器选项卡时,会发生什么情况?实例将保留在 DB 中)
充分利用 Rails 的嵌套属性——它允许您一次性创建父模型和子模型,或者调用父模型。
create
save
因此,您需要在 JS 中创建 2 个按钮,一个用于添加一些新字段,另一个用于删除它们。只有 HTML,没有 AJAX 调用。
要使用嵌套属性,在为 或 构建参数时必须遵守某些约定。通常,在创建模型时,会将一些属性传递给方法,这些属性对应于模型的字段。使用嵌套属性时,需要传递一个附加属性,该属性的形成方式如下:.因此,如果您有 和 model,并且想要同时创建项目和任务,则需要像这样创建它们:
Parent.create
save
create
[children_relation_name]_attributes
Project
Task
Project.create(name: '项目 1', tasks_attributes: [{name: '任务 1'}, {name: '任务 2'}])
(注意任务没有 ids – Rails 会自动分配它们)
以上所有内容仅在模型具有 和
Parent
has_many :children
accepts_nested_attributes_for :children
因此,您的任务只是构建包含 param 的正确参数,将此参数添加到强参数中(如下所示)。您可以使用和构建表单,JS 将字段正确地放入此表单中,嵌套属性以同时创建父记录和子记录。这就是宝石的作用。
children_attributes
children_attributes: [:name, :age, ...]
form_for
fields_for
cocoon
至于 Rails 文档,它相当不错,而且大部分都很全面。是的,没有人是完美的,可能会有一些差距,但没有什么比这个文档更好的了。你也可以参考 Rails 代码,但这比仅仅阅读文档要困难得多。
评论