2010-12-20 6 views
3

Dans une application Ruby on Rails, j'ai un contrôleur sur lequel je souhaite exécuter certaines fonctions de manière conditionnelle, où la condition dépend de l'environnement dans lequel s'exécute l'application. exemple artificiel, en mode de développement, je voudrais qu'il fasse:Méthode d'assistance Rails fonctionnant différemment dans différents environnements

if foo == 5: 
    ... 
end 

Et en mode de production, je voudrais:

if foo > 6: 
    ... 
end 

La différence entre les deux conditions est plus complexe qu'un simple constante (5 ou 6 dans l'exemple ci-dessus).

Quelle est la manière la plus idiomatique de faire cela dans Rails? Est-ce que j'écrirais des méthodes d'aide directement dans les fichiers environments/? Ou ajouter une méthode au contrôleur d'application qui vérifie l'environnement actuel? Ou autre chose?

Répondre

7

Je voudrais simplement ajouter une vérification pour ENV['RAILS_ENV'] dans les instructions logiques.

http://guides.rubyonrails.org/configuring.html#rails-environment-settings

Je change votre code:

if foo == 5 && ENV['RAILS_ENV'] == "development" then 
    ... 
elsif foo > 6 && ENV['RAILS_ENV'] == "production" then 
    ... 
end 

Il est juste une autre condition en vous de contrôle de flux, pas besoin de le compliquer.

Si vous devez faire beaucoup, quelques méthodes application.rb pourraient aider:

def isDev 
    ENV['RAILS_ENV'] == "development" 
end 

def isProd 
    ENV['RAILS_ENV'] == "production" 
end 
+0

J'en suis conscient (ou 'Rails.env' dans les applications Rails 3). Ma question est où et comment mieux l'incorporer dans l'application (dans le contrôleur d'application, dans 'environment.rb', etc.). – jrdioko

+0

Merci pour la clarification. – jrdioko

1

J'ai souvent besoin de faire cela dans mes applications aussi dans divers endroits. Par exemple, je ne veux pas inclure de code analytique en mode développement. Et donc je mis en place une variable d'instance ou deux dans le contrôleur d'application:

before_filter :setup_variables 

def setup_variables 
    @development = (ENV['RAILS_ENV'] == "development") 
    @production = (ENV['RAILS_ENV'] == "production") 
end 

Je peux maintenant vérifier si je suis en mode développement tant dans les contrôleurs ainsi que des vues.

Une autre note, cependant. Si vous faites un lot de commutation par casse (si le développement/si la production), vous voudrez peut-être refactoriser cela dans un ensemble distinct d'objets que vous échangez en fonction de l'environnement. Par exemple, avoir une librairie DevelopmentLogic et une librairie ProductionLogic.

Questions connexes