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

Rails模块开发环境加载正常但Heroku生产环境无法加载

解决Rails生产环境(Heroku)无法加载Concern模块的问题

这个问题我在部署Rails应用到Heroku时碰到过好几次,核心是Rails开发环境和生产环境的代码加载机制差异导致的——开发环境会按需自动加载文件,但生产环境默认会预加载所有代码,要是你的模块不在预加载路径里,就会抛出uninitialized constant错误。针对你的情况,给你几个具体的解决步骤:

1. 确保Concerns目录在自动加载/预加载路径中

Rails 5+默认应该把app/controllers/concerns加入自动加载路径,但有时候Heroku的配置会有遗漏。打开config/application.rb,添加以下代码:

# 确保concerns目录被包含在自动加载和预加载路径中
config.autoload_paths << Rails.root.join('app', 'controllers', 'concerns')
config.eager_load_paths << Rails.root.join('app', 'controllers', 'concerns')

然后重新部署到Heroku:

git add config/application.rb
git commit -m "Add concerns directory to autoload/eager_load paths"
git push heroku main

2. 检查生产环境的预加载配置

打开config/environments/production.rb,确认config.eager_load设置为true(这是Rails生产环境的默认值,但还是确认一下):

config.eager_load = true

如果之前是false,修改后重新部署,因为预加载是生产环境加载所有代码的关键。

3. 临时应急方案:显式require模块(不推荐长期使用)

如果上面的方法暂时没生效,可以在ApplicationController里手动引入模块,绕过自动加载:

# 在ApplicationController开头添加
require_relative 'concerns/response'

class ApplicationController < ActionController::API
  include Response
  include DeviseTokenAuth::Concerns::SetUserByToken
  include ActionController::MimeResponds
end

这个方法能快速解决问题,但不符合Rails的约定优先原则,建议还是让自动加载正常工作。

4. 重启Heroku Dyno

有时候部署后代码缓存没更新,重启一下dyno就能解决:

heroku restart

5. 检查文件名和模块名的大小写匹配

Heroku运行在Linux系统上,文件名大小写敏感。你的模块是Response(驼峰),文件是response.rb(全小写),这个是符合Rails约定的,但还是确认一下有没有拼写错误,比如文件名写成Response.rb或者模块名写错。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:46:19