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

