Jak zdefiniować niestandardowe zmienne konfiguracyjne w szynach


337

Zastanawiałem się, jak dodać niestandardowe zmienne konfiguracyjne do aplikacji railsowej i jak uzyskać do nich dostęp w kontrolerze, np. Chcę zdefiniować katalog upload_directory w plikach konfiguracyjnych, powiedz develop.rb i mieć do niego dostęp w jednym z moich kontrolery.

Po drugie, planowałem mieć wsparcie S3 dla przesyłania w mojej aplikacji, jeśli chciałbym dodać plik yaml z dostępem s3, tajnym kluczem, jak zainicjować go w mojej aplikacji Rails i jak uzyskać dostęp do wartości, które zdefiniowałem w tym pliku konfiguracyjnym.



Nieznacznie powiązane: Nie zapomnij zrestartować serwera podczas dodawania nowych zmiennych konfiguracyjnych.
Damien Ó Ceallaigh

Odpowiedzi:


165

Aktualizacja 1

Bardzo zalecane: Idę teraz z klejnotem Rails Config, aby zapewnić precyzyjną kontrolę, jaką zapewnia.

Aktualizacja 2

Jeśli chcesz szybkiego rozwiązania, sprawdź odpowiedź Jacka Pratta poniżej.

Chociaż moja pierwotna odpowiedź poniżej nadal działa, ta odpowiedź jest obecnie nieaktualna. Polecam przejrzenie aktualizacji 1 i 2.

Oryginalna odpowiedź:

Aby uzyskać szybkie rozwiązanie, bardzo pomocne może być wyświetlenie ekranu „Plik konfiguracyjny YAML” przesłanego przez Ryana Batesa.

W podsumowaniu:

# 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
Ta odpowiedź jest nieaktualna. Zobacz stackoverflow.com/questions/1450285/... poniżej
mattwynne

8
@matt: Czy jest przestarzały, ponieważ Rails 3 został wydany, czy też wszyscy są teraz na Rails 3 lub ...?
Lasse V. Karlsen

Dzięki za zwrócenie uwagi na nieaktualne. Nienawidzę tego w Railsach - kod sprzed 1 roku jest za stary.
jcollum,

2
Dla każdego, kto chce korzystać z metody YAML w szynach 3+, będziesz musiał wymienić RAILS_ENVz Rails.envi RAILS_ROOTz Rails.root.
Ryan

Próbowałem rails_config. W dokumentacji polecają mi zarejestrować RailsConfig w moim app.rb. Zakładam, że app.rb = config / application.rb. Ale gdzie w application.rb powinienem umieścić linię rejestru RailsConfig?
Nhím Hổ Báo

375

W Rails 3 niestandardowe dane konfiguracyjne specyficzne dla aplikacji można umieścić w obiekcie konfiguracji aplikacji. Konfigurację można przypisać w plikach inicjujących lub plikach środowiska - powiedzmy dla danej aplikacji MyApp:

MyApp::Application.config.custom_config_variable = :my_config_setting

lub

Rails.configuration.custom_config_variable = :my_config_setting

Aby odczytać ustawienie, po prostu wywołaj zmienną konfiguracyjną bez jej ustawiania:

Rails.configuration.custom_config_variable
=> :my_config_setting

AKTUALIZACJA Szyny 4

W Rails 4 jest nowy sposób na to => http://guides.rubyonrails.org/configuring.html#custom-configuration

wprowadź opis zdjęcia tutaj


11
Mi to pasuje. Moje ustawienia konfiguracyjne specyficzne dla środowiska umieszczam w środowiskach / {environment} .rb, np. Environment / development.rb. Pamiętaj, aby zrestartować serwer po modyfikacji. Mogą istnieć bardziej eleganckie techniki, ale aktualizuję istniejącą aplikację, która wcześniej używała ENV ['XXX'] w tym samym pliku, a ponieważ chcę ograniczyć liczbę refaktoryzacji podczas aktualizacji, działało to dobrze.
pduey

13
To jest zadanie, ale jak w takim razie uzyskać dostęp do tej wartości?
kevzettler,

9
Jeśli spojrzysz na application.rb aplikacji Rails 3.x, jest napisane: „Konfiguracja aplikacji powinna przejść do plików w config / initializers” zgodnie z tą odpowiedzią. Istnieje wiele dokumentacji na temat dostępu do zmiennej ( edgeguides.rubyonrails.org/configuring.html ). np. w pliku o nazwie some_variables.rb w folderze inicjalizacyjnym umieść zmienną jak opisano powyżej (zastępując MyApp nazwą aplikacji), a następnie, jeśli chcesz jej użyć, po prostu wywołaj config.custom_config_variable Możesz oczywiście użyć dowolnej nazwy zmiennej . @Jack Pratt możesz edytować bardziej kompletną odpowiedź?
jamesc

48
Stary, prosty: Ścieżka: config/environments/production.rb Konfiguracja: config.whatever = false Dostęp w dowolnym miejscu: Rails.configuration.whatever
Victor S

5
Uważaj, że jeśli ustawisz coś tylko w produkcji i spróbujesz uzyskać do niego dostęp w innym środowisku, narzeka undefined method.
lulalala

69

W Railsach 3.0.5 działało dla mnie następujące podejście:

W config/environments/development.rb, napisz

config.custom_config_key = :config_value

Do wartości custom_config_keymożna następnie odwoływać się z innych plików za pomocą

Rails.application.config.custom_config_key

4
Uważaj, że jeśli ustawisz coś tylko w produkcji i spróbujesz uzyskać do niego dostęp w innym środowisku, narzeka undefined method.
lulalala

Próbowałem tego w szynach 4.1 i dostaję błędy: „... method_missing': undefined method przechowuj dla # <Rails :: Aplikacja :: Konfiguracja: 0x007f9f735b7240> ...”. Próbowałem dodać zmienną konfiguracyjną „config.store.works”.
Spundun

1
@Spundun Otrzymujesz ten błąd, ponieważ Railsy nie wiedzą, co storeto jest. Aby użyć metody z tej odpowiedzi, możesz albo zmienić nazwę swojej zmiennej store_works, albo utworzyć config.storeblok ze workszdefiniowaną w niej zmienną .
Paul Pettengill,

Dzięki, w końcu to rozgryzłem. Że są to zagnieżdżone skróty, więc muszę rekurencyjnie inicjować puste skróty, jeśli mam używać kropek w nazwach konfiguracji.
Spundun

31

Działa to w szynach 3.1:

w config / environment.rb (lub w config / environment / .., aby wybrać określone środowisko):

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

Będzie to dostępne w kontrolerze lub widokach takich jak ten:

YourApp::Application.config.yourKey

(Twoja aplikacja powinna zostać zastąpiona nazwą aplikacji).

Uwaga : To jest kod Ruby, więc jeśli masz dużo kluczy konfiguracji, możesz to zrobić:

w config / environment.rb:

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

2
camelCase: o użyj skrzynki węża!
siegy22

30

W szynach 4

Zakładając, że umieścisz zmienne niestandardowe w pliku yaml:

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

Utwórz inicjator, aby je załadować:

# 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

Teraz w dowolnym miejscu aplikacji możesz uzyskać dostęp do tych wartości:

Rails.configuration.acme.api_user

Jest to wygodne, Rails.application.config_for :acmeaby załadować acme.ymli korzystać z odpowiedniego środowiska.


21

Ponieważ Rails 4.2, bez dodatkowych klejnotów, możesz załadować config / hi.yml po prostu używającRails.application.config_for :hi .

Na przykład:

  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. a teraz możesz używać AUTHENTICATIONstałej wszędzie w swojej aplikacji:

    #rails c production
    :001> AUTHENTICATION['username'] => 'aa'
  2. następnie dodać passwords.yml do .gitignore : echo /config/passwords.yml >> .gitignoreutwórz plik Przykład Dla Państwa komfortu cp /config/passwords.yml /config/passwords.example.ymli potem po prostu zmienić swój przykładowy plik w konsoli produkcyjnej z rzeczywistych wartości produkcji.




4

Stworzyłem prostą wtyczkę do ustawień YAML: Yettings

Działa w podobny sposób jak kod w odpowiedzi khelll, ale wystarczy dodać ten plik konfiguracyjny YAML:

app/config/yetting.yml

Wtyczka dynamicznie tworzy klasę, która pozwala na dostęp do ustawień YML jako metod klas w Twojej aplikacji, takich jak:

Yetting.your_setting

Ponadto, jeśli chcesz użyć wielu plików ustawień o unikalnych nazwach, możesz umieścić je w podkatalogu w aplikacji / config w następujący sposób:

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

Następnie możesz uzyskać dostęp do takich wartości:

FirstYetting.your_setting
SecondYetting.your_setting

Zapewnia również domyślne ustawienia, które można zastąpić w zależności od środowiska. Możesz także użyć erb w pliku yml.


Oficjalne repo jest teraz na stronie: github.com/charlotte-ruby/yettings (recenzent SO odrzucił moją edycję, twierdząc, że jest zbyt drobna)
lulalala


4

Jeśli używasz Heroku lub w inny sposób musisz zachować ustawienia aplikacji jako zmienne środowiskowe, klejnot figaro jest bardzo pomocny.


2

Lubię używać ustawień szyn do globalnych wartości konfiguracyjnych, które muszą być zmieniane przez interfejs WWW.


2
Nie chcę używać dodatkowych wtyczek itp., Ponieważ uczę się szyn, więc najlepszym sposobem na to byłoby bez żadnych wtyczek.
Shiv

Uwaga: ta baza danych używa do przechowywania konfiguracji, które mogą być zbyt ciężkie dla niektórych osób.
lulalala

0

Coś, co zaczynamy robić w pracy to uporządkowany skrót ActiveSupport

Co pozwala ci czysto zdefiniować konfigurację w plikach środowiska np

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

-5

Sugeruję dobre podejście, jak w ogóle poradzić sobie z konfiguracją w twojej aplikacji. Istnieją trzy podstawowe zasady:

  • zmień konfigurację, a nie kod;
  • używaj konfiguracji ponad warunkami;
  • napisz kod, który coś znaczy.

Aby uzyskać bardziej szczegółowy przegląd, skorzystaj z tego łącza: Konfiguracja szyn we właściwy sposób

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.