2012-07-30 18 views
5

Ho definito variabili di configurazione personalizzate nella mia app per rails (hash APP_CONFIG). Ok, ora come posso usare queste variabili nei miei modelli? Chiamando direttamente APP_CONFIG ['variable'] nei modelli è un modo non rotaie! Ad esempio, posso utilizzare questi modelli senza l'ambiente Rails. Quindi APP_CONFIG non può essere definito.Utilizzo della variabile di configurazione dell'applicazione Rails nel modello

ATM Io uso il modello osservatore e assegnare variabili di configurazione globali con le variabili di istanza, in questo modo:

def after_initialize model 
    Mongoid.observers.disable :all do 
    model.user_id = APP_CONFIG['user_id']) 
    model.variable = User.find(model.user_id).variable 
    end 
end 

Ma questa soluzione si presenta come una patch scimmia. C'è un modo migliore?

Oppure dovrei mantenerlo più semplice e posso solo definire l'hash APP_CONFIG nella nuova app (non nell'app Rails)?

risposta

2

Io userei l'iniezione di dipendenza. Se si dispone di un oggetto che ha bisogno di vari valori di configurazione, è possibile iniettare l'oggetto di configurazione tramite il costruttore:

class Something 
    def initialize(config = APP_CONFIG) 
    @config = config 
    end 
end 

E se la configurazione è necessaria solo per un singolo metodo, semplicemente passare al metodo:

def something(config = APP_CONFIG) 
    # do something 
end 

Ruby valuta i parametri quando viene chiamato il metodo. Il valore predefinito consente di utilizzare l'oggetto config in sviluppo/produzione senza doverlo passare manualmente ai metodi e utilizzare uno stub anziché la configurazione effettiva nei test.

Invece di definire un'altra variabile globale/costante, si potrebbe anche use the Rails config invece:

def something(config = Rails.config) 
    # do something 
end 
0

/config/config.yml

defaults: &defaults 
    user_id :100 

development: 
    <<: *defaults 

test: 
    <<: *defaults 

production: 
    <<: *defaults 

/config/initializers/app_config.rb

APP_CONFIG = YAML.load_file("#{Rails.root}/config/config.yml")[Rails.env] 

È ora possibile utilizzare APP_CONFIG['user_id'] nel modello

0

Usa :before_create per mantenere il codice localizzato al modello:

class MyModel < ActiveRecord::Base 

    before_create :set_config 

    private 

    def set_config 
    self.app_config = APP_CONFIG 
    end 
end 

Oppure, in alternativa, è possibile utilizzare ActiveSupport::Concern, che è un modo molto pulito di creare un modulo che si può ben riutilizzare nei modelli N :

class MyModel < ActiveRecord::Base  
    include AppConfig  
end 

module AppConfig 
    extend ActiveSupport::Concern 

    included do 
     #... 
    end 

    module ClassMethods 
     #... 
    end 

    def app_config 
     APP_CONFIG 
    end 
end 
Problemi correlati