2011-01-25 18 views
16

Sto provando a creare un'applicazione di rotaie che assegni un valore a una variabile quando l'ambiente è l'ambiente di sviluppo e un altro valore alla stessa variabile quando l'ambiente è l'ambiente di produzione. Voglio specificare entrambi i valori nel mio codice (hardwired) e avere rail sapere quale valore assegnare alla variabile in base a quale ambiente è in esecuzione. Come faccio a fare questo?Rails 3/Impostazione delle variabili di ambiente personalizzate

Nel caso in cui sia importante, successivamente accedo a tale variabile e restituisco il suo valore in un metodo di classe di un modello.

risposta

25

È possibile farlo con gli inizializzatori.

# config/initializers/configuration.rb 
class Configuration 
    class << self 
    attr_accessor :json_url 
    end 
end 

# config/environments/development.rb 
# Put this inside the ______::Application.configure do block 
config.after_initialize do 
    Configuration.json_url = 'http://test.domain.com' 
end 

# config/environments/production.rb 
# Put this inside the ______::Application.configure do block 
config.after_initialize do 
    Configuration.json_url = 'http://www.domain.com' 
end 

Poi nell'applicazione, chiamare la variabile Configuration.json_url

# app/controller/listings_controller.rb 
def grab_json 
    json_path = "#{Configuration.json_url}/path/to/json" 
end 

Quando si sta eseguendo in modalità di sviluppo, questo colpirà l'URL http://test.domain.com.

Quando si esegue in modalità produzione, questo verrà visualizzato l'URL http://www.domain.com.

+1

Qualche possibilità si è rotto in 3.1? Ha funzionato come un fascino nella mia app 3.0, ottenendo ora NoMethodError (metodo non definito 'test_conf' per ActiveSupport :: Configurable :: Configuration: Class): –

+0

# config/application.rb classe Application lnguyen55

+8

C'è un modo molto migliore per farlo con Rails 3+. È possibile utilizzare la configurazione esistente per creare config.json_url = '...' L'ho spiegato ulteriormente su http://jasonnoble.org/2011/12/updated-rails3-custom-environment-variables.html –

-2

Si può scoprire l'ambiente come questo:

ruby-1.9.2-p0 > Rails.env 
    => "development" 

memorizzare il valore in una variabile globale nella vostra config/application.rb ad esempio:

$foo = "something" 

Si potrebbe anche assegnare la variabile nei file config/environments/ invece di decidere in base a ond Rails.env in application.rb. Dipende dalla tua situazione

3

uso il Yettings gem in Rails 3.2, che mi permette di conservare le mie variabili di applicazione in config/yettings.yml in questo modo:

defaults: &defaults 
    api_key: asdf12345lkj 
    some_number: 999 
    an_erb_yetting: <%= "erb stuff works" %> 
    some_array: 
    - element1 
    - element2 

development: 
    <<: *defaults 
    api_key: api key for dev 

test: 
    <<: *defaults 

production: 
    <<: *defaults 

e accedervi in ​​questo modo:

#/your_rails_app/config/yetting.yml in production 
Yetting.some_number #=> 999 
Yetting.api_key #=> "asdf12345lkj" 
15

mi piace per memorizzare le impostazioni in YAML. Per avere diverse impostazioni in base all'ambiente, con le impostazioni predefinite, è possibile avere un file di inizializzazione (diciamo config/initializers/application_config.rb) come questo:

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

... e poi in config/application_config.yml:

defaults: &defaults 
    my_setting: "foobar" 

development: 
    # add stuff here to override defaults. 
    <<: *defaults 

test: 
    <<: *defaults 

production: 
    # add stuff here to override defaults. 
    <<: *defaults 

... poi, estrarre le impostazioni con APP_CONFIG[:my_setting]

+2

Come si può quindi utilizzare "APP_CONFIG" nel codice? Ottengo un errore: costante non inizializzata MyController :: APP_CONFIG – Jojje

+0

@Jojje, riavvia l'applicazione. Vedi railscast dedicato se hai ulteriori domande http://railscasts.com/episodes/85-yaml-configuration-file. Anche i tasti dei simboli non funzionano per me. 'APP_CONFIG ['my_setting']' - questo è il modo in cui leggi le impostazioni. – jibiel

+1

Avevo bisogno di questa configurazione in altri inizializzatori, quindi ho finito con l'uso della riga 'YAML.load_file (...)' all'interno di 'config/environment.rb', subito prima della riga' Application.initialize! '. (tramite [Tyler Long] (http://stackoverflow.com/a/11054390/361609)) – colllin

Problemi correlati