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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 11:49:56