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

Cocoon(Ruby Gem)生产环境失效问题求助

解决Rails生产环境中Cocoon依赖jQuery加载顺序问题

嘿,这个问题我太熟悉了!本地开发模式下资产加载顺序比较宽松,但生产环境是打包压缩后的,依赖顺序错了就会直接炸锅。你已经定位到根源是Cocoon在jQuery之前加载,那咱们直接来解决:

1. 针对传统Sprockets资产管道(Rails 5及之前,或Rails 6+仍用Sprockets)

打开app/assets/javascripts/application.js,调整引入顺序,必须保证jQuery和jquery_ujs在Cocoon之前:

//= require jquery
//= require jquery_ujs
//= require cocoon
//= require_tree .

⚠️ 注意:如果//= require_tree .在Cocoon前面,可能会提前加载包含Cocoon引用的文件,所以一定要把Cocoon的引入放在require_tree .之前,或者确保你的自定义JS里没有提前调用Cocoon的方法。

2. 针对Webpacker(Rails 6+)

如果你的项目用Webpacker管理JS,打开app/javascript/packs/application.js,按顺序导入:

import 'jquery'
import 'jquery_ujs'
import 'cocoon'

Webpack会按导入顺序打包,这样就能保证Cocoon在依赖加载完成后才初始化。

3. 针对Rails 7+ Importmaps

如果用的是Rails 7的Importmaps,先在config/importmap.rb里正确pin依赖:

pin "jquery", to: "https://ga.jspm.io/npm:jquery@3.6.4/dist/jquery.js"
pin "jquery_ujs", to: "https://ga.jspm.io/npm:rails/jquery-ujs@5.0.2/lib/assets/javascripts/jquery_ujs.js"
pin "cocoon", to: "https://ga.jspm.io/npm:cocoon-js@0.9.2/src/cocoon.js"

然后在app/javascript/application.js里按顺序导入:

import "jquery"
import "jquery_ujs"
import "cocoon"

4. 部署时的关键步骤

修改完之后,部署生产环境前一定要预编译资产:

rails assets:precompile RAILS_ENV=production

如果用Capistrano这类部署工具,确保配置里包含了资产预编译的任务,避免部署后资产还是旧的顺序。

最后可以验证一下:部署后打开生产环境页面,查看浏览器控制台的Network标签,确认jquery.js、jquery_ujs.js是在cocoon.js之前加载的,这样就不会再出现Uncaught ReferenceError: jQuery is not defined的报错啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 08:56:53