如何在Rails.application.configure中访问初始化器里设置的值?
解决Rails中application.configure无法访问APP_CONFIG的问题
问题核心
Rails的加载顺序中,config/application.rb里的Rails.application.configure块执行早于config/initializers目录下的初始化代码,直接调用APP_CONFIG[:host]会因常量未定义报错;使用lambda延迟加载无效,是因为部分Rails配置项不会自动执行Proc,直接将其作为值存储。
解决方案
方案1:提前在application.rb中加载APP_CONFIG
将APP_CONFIG的加载逻辑移到config/application.rb开头,确保在configure块执行前初始化常量:
# config/application.rb require_relative "boot" # 加载并初始化APP_CONFIG APP_CONFIG = YAML.load_file(Rails.root.join("config/app_config.yml"))[Rails.env].symbolize_keys require "rails/all" Bundler.require(*Rails.groups) module YourAppName class Application < Rails::Application config.load_defaults 7.0 # 直接访问APP_CONFIG配置 config.action_mailer.asset_host = APP_CONFIG[:host] # 其他自定义配置... end end
方案2:用after_initialize钩子延迟设置配置
如果坚持在initializer中加载APP_CONFIG,可通过Rails的初始化后钩子设置配置,确保APP_CONFIG已初始化:
# config/initializers/00_load_app_config.rb APP_CONFIG = YAML.load_file(Rails.root.join("config/app_config.yml"))[Rails.env].symbolize_keys # 初始化完成后设置配置 Rails.application.config.after_initialize do Rails.application.config.action_mailer.asset_host = APP_CONFIG[:host] end
方案3:确保Proc被正确执行(针对支持的配置项)
若配置项支持Proc延迟加载,可显式使用Proc.new而非lambda,同时确保使用配置的代码会执行Proc:
# config/application.rb config.action_mailer.asset_host = Proc.new { APP_CONFIG[:host] }
注:此方法仅适用于Rails内部会自动执行Proc的配置项,若仍无效,优先选择前两种方案。
内容的提问来源于stack exchange,提问作者fguillen
相关产品推荐
相关产品推荐

