Configuración YAML en Rails: "Un archivo para gobernarlos a todos"


Cuando se desarrollan apps en Rails, notarán que a veces se ocupan ciertas variables una y otra y otra vez a lo largo de la aplicación (de manera global) en ciertos casos. Ejemplos de estas variables son los "secret tokens" que usamos para autenticar algunas requests por sólo citar un ejemplo. Cuando requerimos usar este tipo de configuración, lo más fácil, rápido y sencillo es guardarla dentro de un archivo YAML.

Veamos cómo funcionan:

1) Crear un initializer

Lo primero que hemos de hacer para lograr este truco es un initializer que nos permita cargar el archivo YAML en cuestión. este archivo debe estar en config/initializers/load_app_config.rb (puedes usar cualquier nombre que quieras en lugar de load_app_config) y su contenido debe ser algo parecido a esto:

raw_config = File.read(Rails.root + "config/app_config.yml")
APP_CONFIG = YAML.load(raw_config)[Rails.env].symbolize_keys

Este archivo lo que hace es decir dónde está nuestro archivo de configuración global YAML y cómo cargarlo, convirtiendo en símbolos todas las claves que en él haya para nuestro uso más cómodo en la aplicación web. También nos da acceso a la constante APP_CONFIG que usaremos luego.

2) Archivo YAML

El archivo YAML com tal, está en la ruta especificada allá arriba (config/app_config.yml) y su contenido es el siguiente:

development:

  app_email: myapp@somedomain.com
  app_secret: 894e731f70

test:

  app_email: myapp@somedomain.com
  app_secret: 894e731f70

production:

  app_email: myapp@somedomain.com
  app_secret: 894e731f70


Nótese que estamos definiendo 2 variables globales, "app_email" y "app_secret". Tenemos que definir sus valores según el entorno que se esté usando (desarrollo, pruebas o producción) una definición por entorno, de todas las variables que ocupemos.

3) Uso

Ya que tenemos esta configuración lista, iniciamos el servidor de nuestra app (o lo reiniciamos si es el caso) y para ocupar estas nuevas "variables globales" (que en realidad se llaman símbolos en este caso) haríamos algo como lo siguiente:

Si ocupamos apuntar algo hacia el valor de esas variables globales, en lugar de poner el valor como tal, pondríamos algo como:

APP_CONFIG[:app_email]

Y en todos lados donde pongamos eso, el valor corresponderá respectivamente a "myapp@somedomain.com" como definimos en el archivo YAML. Esto es importante porque los archivos YAML no tienen porqué cargarse en los repositorios de lugares como Github y similares con sus valores reales, de manera que si vas a compartir tu código y necesitas un archivo de esos para hacer funcionar tu app, puedes llenarlo de "valores dummies" que los desarrolladores interesados deberán cambiar por los suyos propios cuando hagan funcionar la app, y no con los tuyos (recuerda documentar esto en tu README). Ahora solo te falta excluir el YAML real de tu app con git y poner uno "falso" (bien comentado) si vas a compartir tu código y usar este método de configuración global. Por otro lado, el usuario final de la aplicación no puede ver este archivo ya en producción y eso protege cosas como tus secret tokens de los curiosos malintencionados. ¿Buen tip no?