You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rails 5.2.0脚手架生成的form_with默认带local: true不符合文档问题

解决Rails 5.2.0脚手架生成form_with默认带local: true的问题

我之前在Rails 5.2版本里也碰到过一模一样的问题——明明官方文档说5.1.2+的form_with默认启用AJAX请求、会自动加data-remote属性,而且rails-ujs也已经并入核心了,但用rails g scaffold Article title:string生成的表单却硬加了local: true,导致HTML里完全看不到data-remote。后来折腾了半天,才发现这其实是Rails 5.2脚手架模板的默认设定,不是环境配置的锅。

下面给你两个实用的解决办法:

1. 自定义脚手架模板(一劳永逸)

如果以后还要生成其他脚手架,不想每次都手动改表单,可以直接修改脚手架的模板文件:

  • 先把官方的脚手架模板导出到本地项目里:
rails generate scaffold_controller scaffold

执行完后,你会在lib/templates/erb/scaffold/_form.html.erb找到表单模板。

  • 打开这个文件,找到form_with那一行,把里面的local: true删掉就行。比如原本的代码是:
<%= form_with(model: @article, local: true) do |form| %>

改成:

<%= form_with(model: @article) do |form| %>

之后再生成新的脚手架,form_with就会默认走AJAX模式,HTML里自然会出现data-remote="true"属性。

2. 手动修改已生成的表单(快速解决当前问题)

如果只是针对已经生成的Article表单,直接打开app/views/articles/_form.html.erb,把local: true从form_with参数里移除就搞定了。保存后刷新页面,查看HTML源码就能看到data-remote属性已经加上了。

额外确认:rails-ujs是否正常加载

顺带可以检查一下rails-ujs有没有正确引入,避免后续AJAX出问题:

  • 打开app/assets/javascripts/application.js,确认里面有这一行(Rails 5.2默认已经包含):
//= require rails-ujs
  • 再看app/views/layouts/application.html.erb里,是不是通过javascript_include_tag 'application'加载了这个JS文件。

最后补充一句:Rails团队在5.2里给脚手架默认加local: true,其实是考虑到很多新手一开始不需要AJAX提交,所以默认用了本地提交模式,但这并不影响form_with本身的默认行为——如果你自己手动写form_with而不加local: true,依然会默认启用AJAX的。

内容的提问来源于stack exchange,提问作者ckib16

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 06:58:18