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.