我有一个Rails应用程序,我把所有重要的配置,例如config / config.yml文件中的sendgrid,new relic,twilio,airbrake等。该文件如下所示:
development:
sendgrid:
username: username
password: password
test:
sendgrid:
username: username
password: password
production:
sendgrid:
username: username
password: password
然后在config / initializers / global_configuration.rb中,我加载了正确的环境配置:
APP_CONFIG = YAML.load_file("#{Rails.root}/config/config.yml")[Rails.env]
现在我希望能够在config / environments / development或config / environments / production中访问这个全局常量,如下所示:
config.action_mailer.smtp_settings = {
address: 'smtp.sendgrid.net',
port: 587,
domain: APP_CONFIG['sendgrid']['domain'],
authentication: "plain",
enable_starttls_auto: true,
user_name: APP_CONFIG['sendgrid']['username'],
password: APP_CONFIG['sendgrid']['password']
}
不幸的是,当Rails启动时,它会抛出以下错误:
Uncaught exception: uninitialized constant APP_CONFIG
似乎在config / initializers之前加载了config / environments。我怎样才能解决这个问题,以便在配置/环境中访问我的全局常量?
看来config / application.rb在config / environments / * .rb文件之前加载,所以我能够挂钩到before_configuration块,然后在其中创建一个全局变量:
config.before_configuration do
::APP_CONFIG = YAML.load_file("#{Rails.root}/config/config.yml")[Rails.env]
end
如果有一个更好的选择(而不是使用ENV),我很乐意删除这个答案并提出更好的答案。
在config / environment /中的所有环境文件中执行此操作
config.after_initialize do
config.action_mailer.smtp_settings = {
address: 'smtp.sendgrid.net',
port: 587,
domain: APP_CONFIG['sendgrid']['domain'],
authentication: "plain",
enable_starttls_auto: true,
user_name: APP_CONFIG['sendgrid']['username'],
password: APP_CONFIG['sendgrid']['password']
}
end