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_for
和form_tag
两种方法。
form_for
和form_tag
在 Rails 中非常相似,都允许您创建表单标签,但第一个使用模型的属性来构建创建或更新表单,而第二个只是创建一个 html 表单标签将 URL 作为操作传递。
【讨论】:
您可以添加指向该报价的链接吗?我在guides.rubyonrails.org 中没有看到它。 那是因为它不是来自 rubyguides 的引用。 :) 我从指南中提取了它,并使用了 blockquote 进行格式化。 请注意,现在使用form_with
,您的标签不会像以前自动添加id
s 那样自动链接到您的输入。要使标签正确地与输入字段配对(使用for
属性),您现在需要将id
属性显式添加到输入中。【参考方案2】:
使用 form_with(更新更多)
form_with
是这个街区的新人。 form_for
和 form_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,也可以使用标签包装输入。
【讨论】:
关于默认id
s 和class
s 的最后一段是一个重要的区别!要使标签正确地与输入字段配对(使用for
属性),您现在需要将id
属性显式添加到输入中。【参考方案3】:
现有的答案很棒。我还发现前几段 here 很有帮助。基本上:
DHH提案:https://github.com/rails/rails/issues/25197 拉取请求:https://github.com/rails/rails/pull/26976/files(我没看过,但可能有用)
form_tag
和form_for
已软性弃用,未来将被form_with
取代。
【讨论】:
以上是关于Rails 5:form_for 与 form_with的主要内容,如果未能解决你的问题,请参考以下文章
markdown 使用Rails FORM_FOR在新窗口中打开PDF