在环境之前加载初始化程序

问题描述 投票:2回答:2

我有一个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。我怎样才能解决这个问题,以便在配置/环境中访问我的全局常量?

ruby-on-rails
2个回答
4
投票

看来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),我很乐意删除这个答案并提出更好的答案。


0
投票

在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
© www.soinside.com 2019 - 2024. All rights reserved.