【发布时间】:2017-10-07 17:09:45
【问题描述】:
Rails 5 引入了新的表单助手方法form_with。
它与form_for 有何不同,什么时候使用更合适?
【问题讨论】:
标签: ruby-on-rails-5 actionview
Rails 5 引入了新的表单助手方法form_with。
它与form_for 有何不同,什么时候使用更合适?
【问题讨论】:
标签: ruby-on-rails-5 actionview
这实际上是在为 Rails 5.1 做准备,只有 form_with 应该被使用。它旨在替代form_for 和form_tag 两种方法。
form_for和form_tag在 Rails 中非常相似,都允许您创建表单标签,但第一个使用模型的属性来构建创建或更新表单,而第二个只是创建一个 HTML 表单标签将 URL 作为操作传递。
【讨论】:
form_with,您的标签不会像以前自动添加ids 那样自动链接到您的输入。要使标签正确地与输入字段配对(使用for 属性),您现在需要将id 属性显式添加到输入中。
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,也可以使用标签包装输入。
【讨论】:
ids 和classs 的最后一段是一个重要的区别!要使标签正确地与输入字段配对(使用for 属性),您现在需要将id 属性显式添加到输入中。
现有的答案很棒。我还发现前几段 here 很有帮助。基本上:
form_tag和form_for已软性弃用,未来将被form_with取代。
【讨论】: