Rails 7部署Heroku后无法加载编译后资产文件问题求助
Rails 7部署Heroku后Stimulus控制器加载失败的解决办法
你遇到的核心问题是:生产环境中应用直接请求未编译的Stimulus控制器原文件(如/assets/controllers/openinghours_controller.js),但Rails 7在Heroku上只会提供预编译后带哈希的资产文件,导致路由错误。按以下步骤排查修复:
1. 确认资产加载方式的配置正确性
Rails 7默认用Importmap或JS Bundling(esbuild),对应不同的配置要求:
- Importmap场景:
打开config/importmap.rb,确保包含:
同时pin_all_from "app/javascript/controllers", under: "controllers"app/javascript/application.js必须导入控制器:import "controllers" - JS Bundling(esbuild)场景:
检查package.json的build命令是否正确编译所有JS文件:
并确保"scripts": { "build": "esbuild app/javascript/*.* --bundle --sourcemap --outdir=app/assets/builds --public-path=assets" }application.html.erb引用的是编译后的合并文件:<%= javascript_include_tag "application", "data-turbo-track": "reload", defer: true %>
2. 修正Production环境的资产配置
Rails 7已弃用config.serve_static_files,改用public_file_server,打开config/environments/production.rb:
# 启用静态文件服务 config.public_file_server.enabled = true # 禁用动态资产编译,生产环境仅用预编译文件 config.assets.compile = false # 确保资产文件名带哈希,避免缓存问题 config.assets.digest = true
3. 验证Stimulus控制器的注册逻辑
检查app/javascript/controllers/index.js,确保正确注册所有控制器:
import { Application } from "@hotwired/stimulus" const application = Application.start() import { definitionsFromContext } from "@hotwired/stimulus-webpack-helpers" application.load(definitionsFromContext(require.context("./", true, /\.js$/)))
如果是新初始化的项目,确认已执行rails stimulus:install完成Stimulus的配置。
4. 确保Heroku预编译流程正常
- 本地先执行
rails assets:precompile,查看public/assets目录下是否生成带哈希的控制器相关资产文件。 - 检查
.gitignore,不要忽略app/assets/builds(JS Bundling)或public/assets(Importmap),否则Heroku无法获取编译后的文件。 - 部署时查看Heroku日志,确认
rake assets:precompile步骤无报错。
5. 清理Heroku缓存并重新部署
有时候缓存会导致旧配置残留,执行以下命令强制清理:
heroku builds:cache:purge git commit --allow-empty -m "Clear Heroku cache" git push heroku main
内容的提问来源于stack exchange,提问作者Doddlin
相关产品推荐
相关产品推荐

