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

Rails 7使用Importmap时$未定义报错的解决方法

问题根因

你碰到的Uncaught ReferenceError: $ is not defined报错来自两个配置疏漏:

  • Importmap 遵循ES模块规范,导入的jQuery默认只在模块内部作用域生效,不会自动挂载到全局window对象,所以你写在页面里的内联<script>标签根本读不到$变量
  • tempusdominus-bootstrap-4 本身依赖全局存在的jQuery对象才能注册datetimepicker插件,哪怕你在application.js里导入了jQuery,没挂到全局的话插件也无法正常绑定到jQuery方法链上。
修复步骤

1. 调整application.js配置,手动暴露jQuery到全局

打开app/javascript/application.js,把原有内容替换为以下代码:

import "@hotwired/turbo-rails"
import "controllers"
import jQuery from "jquery"
// 手动将jQuery挂载到全局,供内联脚本和第三方插件调用
window.$ = window.jQuery = jQuery
import "tempusdominus-bootstrap-4"

注意:jQuery的导入、全局挂载逻辑必须写在tempusdominus-bootstrap-4的导入语句之前,否则插件初始化时会因为找不到jQuery直接报错

2. 适配Turbo的页面加载时机,修改初始化脚本

因为项目用了Turbo做无刷新跳转,原生的jQuery ready事件只会在首次全量加载页面时触发,后续Turbo跳转不会触发该事件。把你原来的datetimepicker初始化脚本改成以下写法即可:

<script>
document.addEventListener('turbo:load', () => {
  $('#datetimepicker1').datetimepicker({locale: 'ru'})
})
</script>

不要把初始化逻辑直接写在jQuery的$(function() {})回调里,否则Turbo跳转后组件会失效,只有手动刷新页面才会正常。

3. 补全缺失的依赖(可选但建议配置)

tempusdominus-bootstrap-4 本身依赖moment.js做日期处理,你配置了俄语locale,还需要引入moment对应的俄语语言包,不然locale配置不会生效。在config/importmap.rb里追加moment相关的依赖映射,再在application.js里挂载完jQuery之后导入moment和对应语言包即可。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 18:22:18