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

Rails 7生产环境使用importmaps时JavaScript文件报404错误问题咨询

问题原因及解决方案

关于config.assets.compile = true的作用说明

这个配置的作用是开启生产环境的实时资产编译,生产环境默认值为false。当值为true时,如果请求的静态资源没有提前预编译,Rails会在收到请求时当场编译资源再返回。这种方式虽然能临时解决404问题,但会大幅降低生产环境响应速度,还存在额外的性能开销和安全隐患,完全不推荐生产环境长期开启,属于临时绕过问题的方案,没有从根本解决问题。

404报错根因

你使用的是Rails 7.0.0.alpha2这个早期测试版本,该版本的importmap功能存在未修复的缺陷:pin_all_from "app/javascript/controllers"声明的控制器文件不会被自动纳入生产环境的资产预编译清单,执行rails assets:precompile时会漏掉这部分JS文件,导致生产环境请求时找不到文件报404。开发环境默认开启实时编译,所以不会出现该问题。

正确解决步骤
  • 第一步:先将config/environments/production.rb中的config.assets.compile改回默认值false
  • 第二步(推荐方案):将Rails版本升级到7.0.0及以上正式稳定版,该版本已经修复了importmap资源自动纳入预编译清单的缺陷,无需额外配置即可正常工作
  • 第二步(临时兼容方案,不升级Rails版本时使用):在config/initializers/assets.rb中手动添加需要预编译的JS文件规则:
    Rails.application.config.assets.precompile += %w( controllers/*.js application.js )
    
  • 第三步:生产环境部署时确保执行了资产预编译命令:
    RAILS_ENV=production rails assets:precompile
    
    绝大多数Rails部署平台都会自动执行该步骤,无需手动操作。
验证方法

本地执行RAILS_ENV=production rails assets:precompile,查看public/assets目录下是否存在controllers文件夹和对应的JS编译文件,以及application.js的编译版本,存在即说明预编译正常,部署后不会再出现404问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 03:15:06