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

Rails初始化器include模块触发弃用警告,使用reloader.to_prepare遇报错

问题原因

Rails现已弃用初始化阶段自动加载常量的行为,你尝试用Rails.application.reloader.to_prepare回调时,错误地把include放在了回调的顶层上下文里——此时self是Rails的reloader对象,它没有include方法,因此触发了undefined method 'include'错误。

解决方法

方法一:手动预加载模块

直接在初始化器开头手动加载这两个配置模块,避免触发自动加载警告:

# app/config/initializers/money.rb
Money.locale_backend = :i18n

# 根据模块实际存放路径调整require语句
# 比如模块在lib目录下:
require 'open_exchange_rates_bank_config'
require 'google_currency_exchange_bank_config'

# 要是模块在initializers的子目录里,就用相对路径:
# require_relative './configs/open_exchange_rates_bank_config'

MoneyRails.configure do |config|
  include OpenExchangeRatesBankConfig
  include GoogleCurrencyExchangeBankConfig

  # 你的其他配置代码
end

方法二:用to_prepare正确包裹配置逻辑

把MoneyRails.configure的逻辑完全放到to_prepare回调内部,确保include是在configure块的上下文(也就是config对象的上下文)中执行:

# app/config/initializers/money.rb
Money.locale_backend = :i18n

Rails.application.reloader.to_prepare do
  MoneyRails.configure do |config|
    # 这里的self是config对象,调用include没问题
    include OpenExchangeRatesBankConfig
    include GoogleCurrencyExchangeBankConfig

    # 你的其他配置代码
  end
end

如果你的模块不在Zeitwerk的自动加载路径中,记得在to_prepare块开头手动require它们,确保模块加载完成。

to_prepare回调在开发环境会随代码变更重新执行,生产环境仅启动时执行,完全符合Rails的加载规范,能彻底消除弃用警告。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 20:13:14