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
相关产品推荐
相关产品推荐

