2010-04-19 17 views
12

Me preguntaba si existe la mejor práctica sobre dónde almacenar configuraciones globales en una aplicación de rieles. Lo que quiero decir con eso es, es decir: tengo algunos valores globales definidos que pueden cambiar, pero no es probable y parece inapropiado almacenarlos en DB ya que se usan tanto. Por ejemplo, tengo SYSTEM_EMAIL & SYSTEM_EMAIL_SIGNATURE & SYSTEM_STORAGE_ROOT.¿Dónde está el mejor lugar para almacenar productos globales en la aplicación Rails?

Ahora mismo los guardo en environment.rb, pero no estoy seguro de si este es el lugar correcto para almacenarlos.

Gracias

EDIT:

respuesta aceptada aún se mantiene en su caso, sin embargo yo ya pasé al uso de https://github.com/markbates/configatron, hay otras opciones pero me gusta configatron más.

Respuesta

15

Una de mis técnicas favoritas es colocar un archivo que contenga las constantes en el directorio config/initializers/ (todos los archivos en este directorio se cargan automáticamente) pero con una sección para cada entorno Rails diferente. p.ej.


case ENV['RAILS_ENV'] 
    when "development" 
    SYSTEM_EMAIL = ... 
    SYSTEM_EMAIL_SIGNATURE = ... 
    when "staging" 
    SYSTEM_EMAIL = ... 
    SYSTEM_EMAIL_SIGNATURE = ... 
    when "production" 
    SYSTEM_EMAIL = ... 
    SYSTEM_EMAIL_SIGNATURE = ... 
end 

Si lo desea, en cambio, para cargar todas las constantes en una gran hachís, puede cargar como un archivo YAML. Crear dos archivos, uno llamado, por ejemplo, config/initializers/email_constants.rb y el otro config/email_constants.yml. En este último poner algo como:


development: 
    :system_email: ... 
    :system_email_signature: ... 
staging: 
    :system_email: ... 
    system_email_signature: ... 

... etc ... 

Luego, en config/initializers/email_constants.rb puesto:


EMAIL_CONSTANTS = YAML.load_file("#{RAILS_ROOT}/config/email_constants.yml")[RAILS_ENV] 

Esto carga todo el archivo YAML y la asigna el valor de la tecla adecuada (que representa el RAILS_ENV) a EMAIL_CONSTANTS.

La ventaja de ambas de estas técnicas es la localidad. Puede colocar todas las constantes relacionadas entre sí (es decir, constantes de correo electrónico en este caso) en un archivo. Además, en lugar de tener las mismas constantes distribuidas en tres archivos diferentes (uno para cada entorno de Rails), los tiene a todos en un solo archivo.

+0

Gracias Sean. Me gusta que te acerques más, excepto que no creo que deba separarme en email_constants.yml - Mantendré todo en contacnts.yml – konung

1

environment.rb es el lugar. Puede agregarlo a un Módulo y agregarlo al directorio lib. entonces podrías llamarlo como Módulo :: MY_GLOBAL_VARIABLE. Ambos tienen puntos fuertes y puntos débiles. En environment.rb está bien, pero a veces parece desordenado. Si todas esas variables globales están relacionadas, puede agruparlas en un módulo.

2

Rails 3 presenta el objeto Aplicación. Incluso con Rails 2, es posible que desee almacenar sus globales de una manera similar.

+0

interesante, empecé a buscar en los carriles 3 recientemente - en concreto rutas, pero no han leído mucho más. Le echaré un vistazo. Gracias por el puntero Marc – konung

10

Debido a que estos valores cambian a menudo en función del entorno en el que se está ejecutando, almaceno globales en config/environments/development.rb|production.rb|test.rb, con valores adecuados para cada entorno.

+0

¿Qué hay de las constantes que deberían ser las mismas en todo dev/prod/test? En lugar de almacenarlos en los tres, ¿hay un archivo que se aplique a los tres entornos? – LikeMaBell

+0

La respuesta a mi propio comentario parece ser /config/environment.rb. Alguien por favor corrígeme si estoy equivocado. – LikeMaBell

+0

Sí, eso es todo. – Ben

1

Guardo dicha información de configuración en un archivo YML. Consulte este screen-cast para obtener más detalles.

Alternativamente, puede utilizar una gema llamada app_config.

1

Normalmente cuando estoy haciendo algo como esto, tengo dos maneras de hacer esto

1 - Si mis variables globales son comunes a los 3 ambientes (desarrollo, prueba, producción), entonces voy a almacenarlo en el archivo/environments.rb

config

Pero digamos que mis valores están cambiando en el medio ambiente

Ex: mi entorno de desarrollo SYSTEM_STORAGE_ROOT es '/ development_root /' y el entorno de pruebas SYSTEM_STOR AGE_ROOT es '/ testing_root /'

entonces almacenará ellos dentro

config/ambientes/

Según el ejemplo anterior

config/ambientes/development.rb tendrá SYSTEM_STORAGE_ROOT = '/ development_root /'

config/ambientes/test.rb tendrán SYSTEM_STORAGE_ROOT = '/ testing_root /'

config/ambientes/production.rb tendrán SYSTEM_STORAGE_ROOT = '/ production_root /'

esperanza que esta ayuda,

aplausos, sameera

Cuestiones relacionadas