Dynamiczna konfiguracja przy użyciu YAML w Ruby

Jak użyć zmiennych środowiskowych w pliku konfiguracyjnym YAML?

Od czasu do czasu programując w języku Ruby, a nawet częściej używając frameworka Ruby on Rails, potrzebuję stworzyć plik konfiguracyjny zawierający na przykład prywatne klucze do API. Oczywiście nie chcę tych danych śledzić w systemie kontroli wersji. Natomiast na dodanie ich do bazy danych jest jeszcze za wcześnie. W takiej sytuacji mogą pomóc zmienne środowiskowe zapisane w pliku .env. W tym przypadku jest jeszcze jeden mały haczyk. Chciałam by wszystkie dane były ustrukturyzowane w jednym pliku. Dlatego też użyłam kombinacji pliku YAML (akronim rekurencyjny od ang. YAML Ain’t Markup Language) ze zmiennymi środowiskowymi i ERB (Embedded Ruby). Oto jak wygląda to rozwiązanie.

Do pliku YAML wpisałam konfigurację potrzebną do obsługi dwóch kont Stripe.

new_york:
  name: 'New York Cafe'
  token: <%= ENV.fetch('NEW_YORK_TOKEN') %>
  secret_api_key: <%= ENV.fetch('NEW_YORK_API_KEY') %>

los_angeles:
  name: 'Los Angeles Cafe'
  token: <%= ENV.fetch('LOS_ANGELES_TOKEN') %>
  secret_api_key: <%= ENV.fetch('LOS_ANGELES_API_KEY') %>

Jak można zauważyć użyłam zmiennych środowiskowych do obsługi wrażliwych danych, które zostaną wstrzyknięte do do pliku YAML przy użyciu ERB. Teraz wystarczy już tylko wczytać dane. Do tego stworzyłam sobie metodę klasy.

class StripeAccount
  def self.configuration
    YAML.safe_load(ERB.new(File.read('path_to_my_file.yml')).result)
  end

  ...
end

Gdziekolwiek będę teraz potrzebować mojej konfiguracji mogę uruchomić kod:

StripeAccount.configuration['new_york']['name']
 => "New York Cafe"

Oczywiście w przypadku wielokrotnego używania tej metody warto pomyśleć o zapamiętaniu konfiguracji zamiast za każdym razem wczytywać ją jeszcze raz.