Rails 5:form_for 与 form_with

Posted

技术标签:

【中文标题】Rails 5:form_for 与 form_with【英文标题】:Rails 5: form_for vs form_with 【发布时间】:2017-10-07 17:09:45 【问题描述】:

Rails 5 引入了新的表单助手方法form_with

它与form_for 有何不同,什么时候使用更合适?

【问题讨论】:

【参考方案1】:

这实际上是在为 Rails 5.1 做准备,只有 form_with 应该被使用。它旨在替代form_forform_tag 两种方法。

form_forform_tag 在 Rails 中非常相似,都允许您创建表单标签,但第一个使用模型的属性来构建创建或更新表单,而第二个只是创建一个 html 表单标签将 URL 作为操作传递。

【讨论】:

您可以添加指向该报价的链接吗?我在guides.rubyonrails.org 中没有看到它。 那是因为它不是来自 ruby​​guides 的引用。 :) 我从指南中提取了它,并使用了 blockquote 进行格式化。 请注意,现在使用form_with,您的标签不会像以前自动添加ids 那样自动链接到您的输入。要使标签正确地与输入字段配对(使用for 属性),您现在需要将id 属性显式添加到输入中。【参考方案2】:

使用 form_with(更新更多)

form_with 是这个街区的新人。 form_forform_tag 现在(基本上)已经过时了。

为什么会有变化?

原因包含在Kasper Timm Hansen's 拉取请求中 - 我不能说比pull request itself 中已经说明的更好(请参阅拉取请求的链接)。

来自拉取请求的直接引用:

form_tag 和 form_for 服务于非常相似的用例。这 PR 统一了这种用法,使得 form_with 可以只输出 类似于 form_tag 的开始表单标签,可以使用 例如一个网址。

这意味着如果您没有模型,则不需要使用 form_tag。您可以使用 form_with 帮助程序,它仍然可以处理 URL。

form_with 默认情况下不会将类或 id 附加到表单。

旧的辅助方法 (form_for) 要求您将 id 和类添加到您的 html 中。 form_with 不做这样的假设。当然,这意味着您将需要多做一些工作来添加所需的 id 和类,但这也可以让您完全控制。

关于 ids / classes 的更多详细信息:例如,正如stwr667 指出的那样,如果您有一些复选框,或者如果您有一个带有标签的输入字段 - 您可能希望它让您的用户超级容易点击复选框 - 典型行为期望如果您点击标签,相关的复选框也将被点击。是的,你必须手动处理那种事情。您可以提供自己的 id,也可以使用标签包装输入。

【讨论】:

关于默认ids 和classs 的最后一段是一个重要的区别!要使标签正确地与输入字段配对(使用for 属性),您现在需要将id 属性显式添加到输入中。【参考方案3】:

现有的答案很棒。我还发现前几段 here 很有帮助。基本上:

form_tagform_for 已软性弃用,未来将被 form_with 取代。

DHH提案:https://github.com/rails/rails/issues/25197 拉取请求:https://github.com/rails/rails/pull/26976/files(我没看过,但可能有用)

【讨论】:

以上是关于Rails 5:form_for 与 form_with的主要内容,如果未能解决你的问题,请参考以下文章

Rails:form_for 命名空间资源

markdown 使用Rails FORM_FOR在新窗口中打开PDF

在不同位置放置Rails Form_For字段

rails form_for标签的自定义文本

Rails 500 服务器错误,对 form_for 部分的 Ajax 请求

Rails:form_for 复选框设置为 true 或 false 是不是选中/取消选中该框