2010-10-04 6 views
34

Possible en double:
Ruby on Rails: Where to define global constants?/Comment coder Constantes dans Rails 3 Application

Je suis intéressé à faire cela le "Rails Way" sur une nouvelle application. Je voudrais également faire référence à des constantes dans un contexte quelconque pour rendre le code plus lisible. J'ai une application où un utilisateur peut demander l'accès à l'ensemble de données d'un autre utilisateur. Ce AccessRequest peut avoir l'un des statuts suivants:

Revue Refusé approuvé

Je peux voir ces valeurs étant utilisées dans les rapports caractéristiques à l'avenir, alors je veux les rendre constantes afin d'éviter toute orthographe ou des problèmes de capitalisation. Je pensais que je voudrais simplement les mettre dans un fichier constants.rb dans le répertoire config/initializers.

Je voudrais me référer à ceux-ci comme AccessRequest :: REVIEW. Puisque j'ai déjà un modèle appelé AccessRequest, est-il logique de les mettre là? Ou enveloppez-les dans une classe dans un fichier constants.rb dans le répertoire config/initializers? De quelle façon est le Rails Way?

Répondre

42

Vous n'avez pas besoin d'utiliser des constantes dans Rails 3. Il est préférable d'utiliser le singleton Rails :: Application.

Dans votre application.rb vous pouvez définir votre comme constante:

module Yourapp 
    class Application < Rails::Application 

    config.access_request.review = 'xxx' 
    end 
end 

Après votre code, vous pouvez appeler

Yourapp::Application.config.access_request.review 

Après si vous changez la valeur dans chaque environnement, vous définissez juste la config.xx dans votre environnement config/environments/production.rb ou autre.

+6

Qu'en est-il des constantes qui changent entre le développement et la production: les clés de api, activer/désactiver les e-mails ou des fonctions, etc? –

+1

Oui, mais vous avez juste besoin de faire votre changement dans config/environments/production.rb et autres environnement – shingara

+0

Merci pour tous vos commentaires shingara et Brian. – AKWF

28

Réponse tardive, mais cette réponse apparaît toujours dans les résultats de la recherche. Mettre la constante dans le modèle a du sens car la constante se rapporte directement à elle. L'utilisation de la configuration de l'application Rails pour stocker les constantes est incorrecte.

Comme par le commentaire figurant dans 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

C'est absolument correct Sasha, merci de l'avoir signalé. Ceci est devenu une question populaire. J'ai utilisé le répertoire des initialiseurs avec beaucoup de succès dans mes deux derniers projets. C'est très pratique lorsque vous avez des constantes sensibles au déploiement qui doivent être conservées séparément et déployées avec des recettes. – AKWF

+6

@AKWF Lorsque vous utilisez les initialiseurs de cette manière, quelle portée utilisez-vous pour définir les constantes? Par exemple, disons que notre initialisateur réside dans 'config/initializers/constants.rb'.Souhaitez-vous mettre 'MAGIC_NUMBER = 42' dans la portée globale, l'entourer d'un bloc' module YourApp', ou autre chose? – evanrmurphy

+0

Comment faites-vous les constantes différentes pour vos différents environnements? Je suis à la recherche de constantes spécifiques à l'environnement auxquelles je peux accéder à partir de mon modèle ERB. – Bradley