Fix missing environment variables for production

It’s common to forget setting a new environment variable after deployment, so I’ll share a strategy that I’m using:

1. Use fetch method

Let’s start with this example of missing NEW_KEY value:

ENV["NEW_KEY"] # nil

ENV.fetch("NEW_KEY") # KeyError: key not found: "NEW_KEY"

So how this works? ENV is a hash-like accessor for environment variables so we can use hash methods but we need only fetch for the moment.

Now it’s time to add more description to the error:

ENV.fetch("NEW_KEY"){ raise "Missing NEW_KEY" } # RuntimeError: Missing NEW_KEY

We have a descriptive warning, but it’s not enough we want to know if there is a missing variable after the deployment.

2. Rails custom configuration

When we start a Rails application, “config/application.rb” is required before booting the server if you are curious to know about Rails initialization process check the official guide.

With this information, we can use Rails custom configuration (check this guide for more information) to have the following configuration:

#config/application.rb

module DemoApp
  class Application < Rails::Application
    # Initialize configuration defaults for originally generated Rails version.
    config.load_defaults 5.1

    config.x.new_key = ENV.fetch("NEW_KEY") { raise "Missing NEW_KEY" }
  end
end

If we try to start a Rails server without setting the ENV variable we will get our custom Error.

Next, we need just to access the defined variable in the source code as follows:

value = Rails.configuration.x.new_key

That’s it, with this approach no more worries about missing ENV variables! 🙂