Rails 7开发环境下Stimulus及CSS资源摘要缓存异常问题
Rails 7开发环境资源修改后404(旧摘要路径问题)
问题场景
- 使用Rails 7默认配置(Import Maps + Stimulus),本地Puma服务器开发环境
- 修改
app/javascript/editor/section.js后,浏览器和Puma抛出404,请求旧摘要的JS文件 - 补充案例:使用
dartsass-railsgem,运行bin/rails dartsass:watch,修改Sass文件后同样出现旧摘要CSS文件的404错误 - 已禁用浏览器HTTP缓存,问题仍存在;重启Puma可临时解决
错误示例:
浏览器控制台报错:
GET http://localhost:3000/assets/editor/section-ca5da14b07bf02053399e5391d999b5870acc0d8783bb5d7844ce5a22f2278da.js net::ERR_ABORTED 404 (Not Found)Puma控制台报错:
ActionController::RoutingError (No route matches [GET] "/assets/editor/section-ca5da14b07bf02053399e5391d999b5870acc0d8783bb5d7844ce5a22f2278da.js"):
解决方案
1. 关闭开发环境的资源摘要缓存
修改config/environments/development.rb,添加或调整配置:
config.assets.digest = false
开发环境下无需带摘要的资源路径,关闭后直接引用文件名,避免摘要不匹配问题。
2. 确保资源监听机制正常工作
确认开发环境启用了资源监听,在config/environments/development.rb中:
config.assets.watch = true # 默认已开启,可确认配置 # 调整缓存存储,避免内存缓存导致的更新延迟 config.assets.configure do |env| env.cache = ActiveSupport::Cache.lookup_store(:memory_store, size: 64.megabytes) end
3. 处理Dart Sass监听进程问题
如果使用dartsass-rails,修改Sass后未触发编译,尝试:
- 重启
bin/rails dartsass:watch进程 - 若为Linux系统,调整inotify文件监听限制(解决文件变更无法被捕获的问题):
echo fs.inotify.max_user_watches=524288 | sudo tee -a /etc/sysctl.conf && sudo sysctl -p
4. 手动清除资源缓存
执行命令清除旧的资源缓存,避免残留的旧摘要信息:
bin/rails assets:clean bin/rails assets:clobber
5. 确认Asset Reloader中间件加载
确保开发环境加载了资源重载中间件,在config/environments/development.rb中:
config.middleware.use Rails::Middleware::AssetReloader
问题原因
开发环境中,Rails Asset Pipeline会缓存资源文件的摘要哈希值,当文件修改后,资源监听进程可能未及时更新缓存,导致Puma仍使用旧摘要生成资源路径,而新文件的摘要已变更,最终引发404错误。
内容的提问来源于stack exchange,提问作者Frank Koehl
相关产品推荐
相关产品推荐

