使用rails-ujs的Rails.ajax调用返回false无响应(Rails 5.1)
排查Rails 5.1中rails-ujs Ajax调用无响应(返回false)的问题
返回false通常意味着rails-ujs在发起请求前的前置校验没通过,或者请求根本没被正常触发,咱们一步步来定位问题:
1. 先确认rails-ujs是否真的加载成功
打开浏览器控制台,直接输入console.log(Rails):
- 如果输出
undefined,说明rails-ujs没正确加载。检查你的application.js,确保有//= require rails-ujs这条语句,而且它的位置在其他可能依赖它的代码之前(如果用了jQuery,也建议把jQuery的引入放在rails-ujs之前)。另外,也要确认页面加载时没有JS报错导致rails-ujs初始化失败。 - 如果能正常输出
Rails对象,说明加载没问题,继续往下排查。
2. 检查CSRF Token是否有效
rails-ujs会自动为Ajax请求带上CSRF Token,但如果页面里没有这个token,请求会被拦截并返回false:
- 查看页面的
<head>标签,确认是否有<meta name="csrf-token" content="...">。如果没有,确保你的布局文件里加了<%= csrf_meta_tags %>。 - 也可以手动在Ajax配置里添加headers试试:
Rails.ajax({ url: "/notifications.json", type: "GET", headers: { 'X-CSRF-Token': document.querySelector('meta[name="csrf-token"]').content }, success: function(data) { console.log(data) } })
3. 验证后端路由和接口是否正常
- 先在终端运行
rails routes,确认有没有匹配GET /notifications.json的路由,比如是否存在类似get '/notifications', to: 'notifications#index', format: :json的配置。 - 直接在浏览器地址栏访问
/notifications.json,看看能不能返回预期的JSON数据。如果地址栏访问都报错(比如404、500),那先把后端接口的问题解决了再说。
4. 排查版本兼容性和资产管道配置
Rails 5.1的资产管道方式有两种可能,要对应正确的引入方式:
- 如果是默认的Sprockets资产管道:确保
application.js里的//= require rails-ujs没被注释,且Gemfile里的rails版本是5.1.x。 - 如果是用Webpacker:应该用
import Rails from '@rails/ujs'; Rails.start();来初始化rails-ujs,而不是Sprockets的引入方式,别搞混了。
5. 调试rails-ujs的前置校验逻辑
因为Rails.ajax返回false,肯定是内部某个校验没通过。可以用浏览器的调试功能定位:
在控制台输入:
debugger; Rails.ajax({ url: "/notifications.json", type: "GET", success: function(data) { console.log(data) } })
然后在开发者工具的Sources面板里找到rails-ujs的代码,跟着执行流程看哪一步返回了false——比如是否因为CSRF Token缺失、请求被自定义的钩子拦截等。
6. 排查JS代码冲突
有时候页面里的其他JS库(比如旧版本的jQuery、自定义的Ajax封装)会覆盖或干扰Rails对象、XMLHttpRequest的行为:
- 试试在一个空白的测试页面(比如新建一个只有
<%= csrf_meta_tags %>和引入rails-ujs的视图)里测试Rails.ajax,如果能正常工作,说明是原有页面的其他JS代码导致的冲突,逐步排查移除可疑代码即可。
内容的提问来源于stack exchange,提问作者Léo Rocha
相关产品推荐
相关产品推荐

