Come definire variabili di configurazione personalizzate nei binari


337

Mi chiedevo come aggiungere variabili di configurazione personalizzate a un'applicazione rails e come accedervi nel controller, per esempio voglio essere in grado di definire una directory upload_directory nei file di configurazione dire development.rb ed essere in grado di accedervi in ​​uno dei miei controllori.

In secondo luogo, avevo in programma di avere il supporto S3 per i caricamenti nella mia applicazione, se volevo aggiungere un file yaml con accesso s3, chiave segreta, come posso inizializzarlo nella mia app Rails e come posso accedere ai valori che ho definito in quel file di configurazione.



Leggermente correlato: non dimenticare di riavviare il server quando si aggiungono nuove variabili di configurazione.
— Damien Ó Ceallaigh,

Risposte:


165

Aggiornamento 1

Molto consigliato: oggi vado con la gemma di Rails Config per il controllo a grana fine che fornisce.

Update2

Se vuoi una soluzione rapida, controlla di seguito la risposta di Jack Pratt .

Anche se la mia risposta originale qui sotto funziona ancora, questa risposta è obsoleta. Consiglio di consultare gli aggiornamenti 1 e 2.

Risposta originale:

Per una soluzione rapida, guardare la schermata "File di configurazione YAML" trasmessa da Ryan Bates dovrebbe essere molto utile.

In sintesi:

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

# application.rb
if APP_CONFIG['perform_authentication']
  # Do stuff
end

62
Questa risposta è obsoleta. Vedere stackoverflow.com/questions/1450285/... sotto
— mattwynne

8
@matt: è obsoleto perché Rails 3 è stato rilasciato o perché ora tutti sono su Rails 3 o ...?
— Lasse V. Karlsen,

Grazie per aver sottolineato il obsoleto. Lo odio per Rails: il codice di 1 anno fa è troppo vecchio.
— jcollum,

2
Per chiunque desideri utilizzare il metodo YAML in Rails 3+, dovrai sostituirlo RAILS_ENVcon Rails.enve RAILS_ROOTcon Rails.root.
— Ryan,

Ho provato rails_config. Nella documentazione mi dicono di registrare RailsConfig nel mio app.rb. Presumo che app.rb = config / application.rb. Ma dove in application.rb dovrei inserire la riga RailsConfig del registro?
— Nhím Hổ Báo,

375

In Rails 3, i dati di configurazione personalizzati specifici dell'applicazione possono essere inseriti nell'oggetto di configurazione dell'applicazione. La configurazione può essere assegnata nei file di inizializzazione o nei file di ambiente, ad esempio per una determinata applicazione MyApp:

MyApp::Application.config.custom_config_variable = :my_config_setting

o

Rails.configuration.custom_config_variable = :my_config_setting

Per leggere l'impostazione, è sufficiente chiamare la variabile di configurazione senza impostarla:

Rails.configuration.custom_config_variable
=> :my_config_setting

AGGIORNA Rotaie 4

In Rails 4 c'è un nuovo modo per questo => http://guides.rubyonrails.org/configuring.html#custom-configuration

inserisci qui la descrizione dell'immagine


11
Per me funziona. Ho inserito le impostazioni di configurazione specifiche del mio ambiente in ambienti / {environment} .rb, ad es. Ambienti / development.rb. Assicurati di riavviare il server dopo la modifica. Potrebbero esserci tecniche più eleganti, ma sto aggiornando un'app esistente che precedentemente utilizzava ENV ['XXX'] nello stesso file, e poiché voglio limitare la quantità di refactoring durante l'aggiornamento, questo ha funzionato bene.
— pduey,

13
Questo è un compito ma come si accede a questo valore allora?
— Kevzettler,

9
Se si guarda in application.rb di un'app 3.x di rails, si dice "La configurazione dell'applicazione dovrebbe andare nei file in config / inizializzatori" come da questa risposta. C'è molta documentazione su come accedere alla variabile ( edgeguides.rubyonrails.org/configuring.html ). ad es. in un file chiamato some_variables.rb nella cartella degli inizializzatori posiziona la variabile come descritto sopra (sostituendo MyApp con il nome della tua app) quindi quando vuoi usarla chiama config.custom_config_variable Puoi ovviamente usare qualunque nome di variabile ti piace . @ Jack Pratt potresti modificare una risposta più completa?
— Jamesc,

48
Amico, semplice: Percorso: config/environments/production.rb Config: config.whatever = false Accedilo ovunque: Rails.configuration.whatever
— Victor S

5
Fai attenzione che se imposti qualcosa solo in produzione e provi ad accedervi in ​​un altro ambiente, si lamenterebbe undefined method.
— Lulalala,

69

In Rails 3.0.5, il seguente approccio ha funzionato per me:

In config/environments/development.rb, scrivi

config.custom_config_key = :config_value

È custom_config_keypossibile quindi fare riferimento al valore da altri file utilizzando

Rails.application.config.custom_config_key

4
Fai attenzione che se imposti qualcosa solo in produzione e provi ad accedervi in ​​un altro ambiente, si lamenterebbe undefined method.
— Lulalala,

Ho provato questo in Rails 4.1 e sto ricevendo errori, "... method_missing': undefined method store 'per # <Rails :: Application :: Configuration: 0x007f9f735b7240> ...". Stavo cercando di aggiungere la variabile di configurazione "config.store.works".
— Spundun,

1
@Spundun Stai ricevendo questo errore, perché Rails non sa cosa storesia. Per utilizzare il metodo in questa risposta, puoi rinominare la tua variabile store_workso creare un config.storeblocco con in worksessa definito.
— Paul Pettengill,

Grazie, alla fine l'ho capito. Che questi sono hash nidificati, quindi devo inizializzare hash vuoti in modo ricorsivo se devo usare i punti nei miei nomi di configurazione.
— Spundun,

31

Funziona su binari 3.1:

in config / environment.rb (o in config / environment / .. per indirizzare un ambiente specifico):

YourApp::Application.config.yourKey = 'foo'

Questo sarà accessibile nel controller o in viste come questa:

YourApp::Application.config.yourKey

(YourApp deve essere sostituita dal nome dell'applicazione.)

Nota : è il codice Ruby, quindi se hai molte chiavi di configurazione, puoi farlo:

in config / environment.rb:

YourApp::Application.configure do
  config.something = foo
  config.....
  config....
  .
  config....
end

2
camelCase: o usa snake_case!
— siegy22,

30

In Rails 4

Supponendo di inserire le variabili personalizzate in un file yaml:

# config/acme.yml
development:
  :api_user: 'joe'
  :api_pass: 's4cret'
  :timeout: 20

Crea un inizializzatore per caricarli:

# config/initializers/acme.rb
acme_config = Rails.application.config_for :acme

Rails.application.configure do
  config.acme = ActiveSupport::OrderedOptions.new
  config.acme.api_user = acme_config[:api_user]
  config.acme.api_pass = acme_config[:api_pass]
  config.acme.timeout  = acme_config[:timeout]
end

Ora ovunque nella tua app puoi accedere a questi valori in questo modo:

Rails.configuration.acme.api_user

È conveniente Rails.application.config_for :acmecaricare acme.ymle utilizzare l'ambiente corretto.


21

Da Rails 4.2, senza gemme aggiuntive, puoi caricare config / hi.yml semplicemente usando Rails.application.config_for :hi.

Per esempio:

  1. touch config/passwords.yml

        #config/passwords.yml
        development:
          username: 'a'
          password: 'b'
        production:
          username: 'aa'
          password: 'bb'
  1. touch config/initializers/constants.rb

    #config/initializers/constants.rb
    AUTHENTICATION = Rails.application.config_for :passwords
  1. e ora puoi usare AUTHENTICATIONcostante ovunque nella tua applicazione:

    #rails c production
    :001> AUTHENTICATION['username'] => 'aa'
  2. quindi aggiungere passwords.yml a .gitignore : echo /config/passwords.yml >> .gitignorecreare un file di esempio per il vostro comfort cp /config/passwords.yml /config/passwords.example.ymle poi basta modificare il file di esempio nella tua console di produzione con valori di produzione attuali.




4

Ho creato un semplice plug-in per le impostazioni YAML: Yettings

Funziona in modo simile al codice nella risposta di khelll, ma devi solo aggiungere questo file di configurazione YAML:

app/config/yetting.yml

Il plug-in crea dinamicamente una classe che ti consente di accedere alle impostazioni YML come metodi di classe nella tua app in questo modo:

Yetting.your_setting

Inoltre, se si desidera utilizzare più file di impostazioni con nomi univoci, è possibile posizionarli in una sottodirectory all'interno dell'app / config in questo modo:

app/config/yettings/first.yml
app/config/yettings/second.yml

Quindi puoi accedere ai valori in questo modo:

FirstYetting.your_setting
SecondYetting.your_setting

Fornisce inoltre impostazioni predefinite che possono essere sovrascritte per ambiente. Puoi anche usare erb all'interno del file yml.


Il repository ufficiale è ora su: github.com/charlotte-ruby/yettings (il revisore SO ha respinto la mia modifica dicendo che è troppo minore)
— lulalala


4

Se usi Heroku o hai bisogno di mantenere le impostazioni dell'applicazione come variabili di ambiente, la gemma di Figaro è molto utile.


2

Mi piace usare le impostazioni rotaie per i valori di configurazione globali che devono essere modificabili tramite l'interfaccia web.


2
Non voglio usare plugin aggiuntivi ecc., Mentre sto imparando le guide, quindi il modo migliore per farlo sarebbe senza plugin.
— Shiv,

Nota che questo utilizza il database per archiviare le configurazioni, che potrebbe essere troppo pesante per alcune persone.
— Lulalala,

0

Qualcosa che stiamo iniziando a fare sul lavoro è ActiveSupport Ordered Hash

Ciò consente di definire la configurazione in modo pulito all'interno dei file di ambiente, ad es

config.service = ActiveSupport::OrderedOptions.new
config.service.api_key = ENV['SERVICE_API_KEY']
config.service.shared_secret = ENV['SERVICE_SHARED_SECRET']

-5

Vorrei suggerire un buon approccio su come gestire la configurazione nella tua applicazione. Esistono tre regole di base:

  • cambia la tua configurazione non un codice;
  • utilizzare le configurazioni rispetto alle condizioni;
  • scrivere codice che significhi qualcosa.

Per una panoramica più dettagliata segui questo link: Configurazione delle rotaie nel modo corretto

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.