Donato
Donato

Reputation: 2777

loading the initializer before the environment

I have a Rails application and I put all my important configurations, e.g. sendgrid, new relic, twilio, airbrake, etc, in a config/config.yml file. The file looks as follows:

development:
  sendgrid:
    username: username
    password: password

test:
  sendgrid:
    username: username
    password: password

production:
  sendgrid:
    username: username
    password: password

Then in config/initializers/global_configuration.rb, I load the correct environment configuration:

APP_CONFIG = YAML.load_file("#{Rails.root}/config/config.yml")[Rails.env]

Now I want to be able to access this global constant in config/environments/development or config/environments/production, as so:

  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']
  }

Unfortunately, when Rails starts up, it throws the following error:

Uncaught exception: uninitialized constant APP_CONFIG

It appears that config/environments is loaded before config/initializers. How can I get around this so I can access my global constant in config/environments?

Upvotes: 3

Views: 1856

Answers (2)

Ishtiaque05
Ishtiaque05

Reputation: 451

Do this in all the environment file inside 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

Upvotes: 0

Donato
Donato

Reputation: 2777

It appears config/application.rb is loaded before the config/environments/*.rb files, so I was able to hook into the before_configuration block and then create a global variable within it:

config.before_configuration do
  ::APP_CONFIG = YAML.load_file("#{Rails.root}/config/config.yml")[Rails.env]
end

If there is a better option (rather than using ENV), I will gladly delete this answer and upvote the better one.

Upvotes: 7

Related Questions