2010-10-04 12 views
34

Duplicar posible:
Ruby on Rails: Where to define global constants?Dónde/cómo codificar Constantes en Rails 3 Aplicación

Tengo interés en hacer esto, el "Camino rieles" en una nueva aplicación. También me gustaría referirme a las constantes en algún tipo de contexto para hacer que el código sea más legible. Tengo una aplicación donde un usuario puede solicitar acceso al conjunto de datos de otros usuarios. Este AccessRequest puede tener uno de los siguientes estados:

revisión denegado Aprobado

puedo ver estos valores se utilizan en funciones de informes en el futuro, así que quiero que sean constantes con el fin de evitar cualquier ortografía o problemas de capitalización. Pensé que simplemente pondría estos en un archivo constants.rb en el directorio config/initializers.

Me gustaría referirme a estos como AccessRequest :: REVIEW. Como ya tengo un modelo llamado AccessRequest, ¿tiene sentido ponerlos allí? ¿O envolverlos en una clase en un archivo constants.rb en el directorio config/initializers? ¿Cuál es el camino de Rails?

Respuesta

42

No necesita usar constantes en Rails 3. Es mejor usar Rails :: Application singleton.

En su application.rb puede definir su constante como:

module Yourapp 
    class Application < Rails::Application 

    config.access_request.review = 'xxx' 
    end 
end 

Después de su código puede llamar

Yourapp::Application.config.access_request.review 

Después si cambia el valor en cada entorno, Usted acaba de definir la config.xx en su config/environments/production.rb u otro entorno.

+6

¿Qué hay de las constantes que cambian entre el desarrollo y la producción: claves de la API, activar/desactivar los mensajes de correo electrónico o características, etc? –

+1

Sí, pero solo necesita hacer su cambio en config/environments/production.rb y otro ambiente – shingara

+0

Gracias por todos sus comentarios shingara y Brian. – AKWF

28

Respuesta tardía, pero publicar como esta respuesta todavía aparece en los resultados de búsqueda. Poner la constante en el modelo tiene sentido ya que la constante pertenece directamente a él. Usar la configuración de la aplicación Rails para almacenar constantes es incorrecto.

De acuerdo con el comentario que aparece en application.rb:

# Application configuration should go into files in config/initializers 
# -- all .rb files in that directory are automatically loaded 

This is still valid as of Rails 3.

+1

Eso es absolutamente correcto Sasha, gracias por señalarlo. Esto se ha convertido en una pregunta popular. He utilizado el directorio de inicializadores con gran éxito en mis dos últimos proyectos. Es muy útil cuando tiene algunas constantes sensibles a la implementación que deben mantenerse separadas y desplegadas con recetas. – AKWF

+6

@AKWF Al utilizar los inicializadores de esta manera, ¿qué ámbito utiliza para definir las constantes? Por ejemplo, digamos que nuestro inicializador vive en 'config/initializers/constants.rb'.¿Pondrías 'MAGIC_NUMBER = 42' en el alcance global, lo envolverías con un bloque' module YourApp', o algo más? – evanrmurphy

+0

¿Cómo se hacen las constantes diferentes para sus diferentes entornos? Estoy buscando constantes específicas del entorno a las que puedo acceder desde mi plantilla ERB. – Bradley