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

Rails 5.2中Uncaught ReferenceError: $ is not defined问题求助

解决Rails中CoffeeScript里$ is not defined的问题

你遇到的这个问题在Rails开发中挺常见的——明明装了jquery-rails也能看到页面里的jQuery脚本标签,可CoffeeScript代码就是找不到$对象。主要问题大概率出在脚本加载顺序或者Turbolinks/Turbo的事件绑定时机上,下面给你几个具体的排查和解决方向:

1. 确认application.js的加载顺序

先检查你的app/assets/javascripts/application.js,必须保证jQuery的引入在自定义脚本之前。正确的结构应该类似这样:

//= require jquery
//= require rails-ujs
//= require turbolinks
//= require_tree .

//= require_tree .会按目录顺序加载所有JS/Coffee文件,如果你的campaigns.coffee意外在jQuery之前被加载,就会直接触发$ is not defined的错误。如果是手动引入自定义脚本,一定要把它放在//= require jquery之后。

如果你的Rails版本用了Turbolinks(Rails 5-6)或者Turbo(Rails 7+),传统的$ ->(也就是$(document).ready())的触发时机可能不符合预期——Turbolinks会复用页面容器,初始加载时可能出现jQuery还未完全就绪就执行代码的情况,页面切换时也不会再次触发ready事件。

把你的campaigns.coffee改成适配Turbolinks的写法:

$(document).on 'turbolinks:load', ->
  $("tr[data-link]").click ->
    window.location.replace($(this).data("link"))

如果是Rails 7+使用Turbo,对应的事件是turbo:load:

$(document).on 'turbo:load', ->
  $("tr[data-link]").click ->
    window.location.replace($(this).data("link"))

3. 修复删除按钮的冲突问题

顺便提个小细节:当前代码会导致点击行内的删除按钮时,同时触发跳转和删除动作,这显然不是你想要的。可以给点击事件加个判断,阻止按钮触发行跳转:

$(document).on 'turbolinks:load', ->
  $("tr[data-link]").click (e) ->
    # 如果点击的是按钮或按钮内部元素,不执行跳转
    if $(e.target).closest('.btn').length == 0
      window.location.replace($(this).data("link"))

4. 验证jQuery是否真的加载完成

如果前面的方法都没用,可以在浏览器控制台直接输入$或者jQuery:

  • 如果返回函数,说明jQuery已经正常加载;
  • 如果返回undefined,那说明虽然页面有脚本标签,但可能加载失败、有网络错误,或者其他脚本报错中断了jQuery的加载。可以去浏览器的「网络」面板查看jQuery脚本的请求状态,确认是否返回200。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:08:21