Jak definiować własne zmienne konfiguracyjne w rails
Zastanawiałem się, jak dodać własne zmienne konfiguracyjne do aplikacji rails i jak uzyskać do nich dostęp w kontrolerze, np. chcę móc zdefiniować upload_directory w plikach konfiguracyjnych say development.rb i mieć do niego dostęp w jednym z moich kontrolerów.
Po drugie planowałem mieć obsługę S3 dla uploadów w mojej aplikacji, gdybym chciał dodać plik yaml z dostępem do s3, tajnym kluczem, jak go zainicjować w mojej aplikacji Rails i jak uzyskać dostęp do wartości, które zdefiniowałem w tym pliku konfiguracyjnym.
14 answers
Update 1
Bardzo zalecane: wybieram Rails Config gem w dzisiejszych czasach dla drobnoziarnistej kontroli, którą zapewnia.
Update2
Jeśli chcesz szybkiego rozwiązania, sprawdź odpowiedź Jacka Pratta poniżej.
Chociaż moja oryginalna odpowiedź poniżej nadal działa, odpowiedź ta jest obecnie nieaktualna. Polecam przejrzeć aktualizacje 1 i 2.
Oryginalna Odpowiedź:
Dla szybkiego rozwiązania, oglądając " YAML Plik konfiguracyjny "screen cast autorstwa Ryana Batesa powinien być bardzo pomocny.
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
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:02:37
W Rails 3, specyficzne dla aplikacji niestandardowe dane konfiguracyjne mogą być umieszczone w obiekcie konfiguracyjnym aplikacji. Konfiguracja może być przypisana w plikach inicjalizacyjnych lub plikach środowiskowych -- 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, wystarczy wywołać zmienną konfiguracyjną bez jej ustawiania:
Rails.configuration.custom_config_variable
=> :my_config_setting
UPDATE Rails 4
W Rails 4 jest nowy sposób na to => http://guides.rubyonrails.org/configuring.html#custom-configuration
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-17 11:04:15
W Rails 3.0.5 zadziałało dla mnie następujące podejście:
In config/environments/development.rb
, write
config.custom_config_key = :config_value
Wartość custom_config_key
może być następnie odwołana z innych plików za pomocą
Rails.application.config.custom_config_key
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-21 20:42:31
To działa w rails 3.1:
W Config / environment.rb (lub w config / environments/.. ukierunkowanie na konkretne środowisko) :
YourApp::Application.config.yourKey = 'foo'
Będzie to dostępne w kontrolerze lub widokach takich jak:
YourApp::Application.config.yourKey
(nazwę aplikacji należy zastąpić nazwą aplikacji.)
Uwaga : jest to kod Ruby, więc jeśli masz dużo kluczy konfiguracyjnych, możesz to zrobić:
W config / environment.rb:
YourApp::Application.configure do
config.something = foo
config.....
config....
.
config....
end
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-15 22:28:02
In Rails 4
Zakładając, że umieścisz swoje zmienne niestandardowe w pliku yaml:
# config/acme.yml
development:
:api_user: 'joe'
:api_pass: 's4cret'
:timeout: 20
Utwórz inicjalizator, 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 gdziekolwiek w aplikacji możesz uzyskać dostęp do tych wartości, jak tak:
Rails.configuration.acme.api_user
Jest to wygodne, że Rails.application.config_for :acme
załaduje twoje acme.yml
i użyje odpowiedniego środowiska.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-03 07:51:58
Od Rails 4.2, bez dodatkowych klejnotów, można załadować config/hi.yml po prostu za pomocą Rails.application.config_for :hi
.
Na przykład:
-
touch config/passwords.yml
#config/passwords.yml development: username: 'a' password: 'b' production: username: 'aa' password: 'bb'
-
touch config/initializers/constants.rb
#config/initializers/constants.rb AUTHENTICATION = Rails.application.config_for :passwords
-
I teraz możesz używać
AUTHENTICATION
stałej wszędzie w swojej aplikacji:#rails c production :001> AUTHENTICATION['username'] => 'aa'
Następnie dodaj hasła.yml do .gitignore:
echo /config/passwords.yml >> .gitignore
, Utwórz przykładowy plik dla swojego comfortcp /config/passwords.yml /config/passwords.example.yml
, a następnie po prostu edytuj przykładowy plik w konsoli produkcyjnej z rzeczywistymi wartościami produkcyjnymi.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-27 12:47:31
Chciałem tylko zaktualizować to dla najnowszych fajnych rzeczy w Rails 4.2, teraz możesz to zrobić w dowolnym pliku config/**/*.rb
:
config.x.whatever.you.want = 42
...i to będzie dostępne w aplikacji jako:
Rails.configuration.x.whatever.you.want
Zobacz więcej tutaj: http://guides.rubyonrails.org/configuring.html#custom-configuration
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-29 22:21:55
Zobacz ten zgrabny klejnot robi dokładnie to: https://github.com/mislav/choices
W ten sposób twoje poufne dane nie zostaną ujawnione w projektach open source
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-09-30 13:12:43
Stworzyłem prosty plugin do ustawień YAML: Yettings
Działa podobnie do kodu w odpowiedzi khellla, ale wystarczy dodać ten plik konfiguracyjny YAML:
app/config/yetting.yml
Wtyczka dynamicznie tworzy klasę, która umożliwia dostęp do ustawień YML jako metod klasy w Twojej aplikacji w następujący sposób:
Yetting.your_setting
Ponadto, jeśli chcesz użyć wielu plików ustawień o unikalnych nazwach, możesz umieścić je w podkatalogu wewnątrz app/config, jak to:
app/config/yettings/first.yml
app/config/yettings/second.yml
Następnie możesz uzyskać dostęp do wartości w następujący sposób:
FirstYetting.your_setting
SecondYetting.your_setting
Zapewnia również domyślne ustawienia, które mogą być nadpisywane dla każdego środowiska. Można również użyć erb wewnątrz pliku yml.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-07 19:51:31
Bardzo mi się podoba settingslogic gem. Bardzo łatwy w konfiguracji i użyciu.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-07 21:05:39
Jeśli używasz Heroku lub w inny sposób musisz zachować ustawienia aplikacji jako zmienne środowiskowe, gem figaro jest bardzo pomocny.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-18 17:13:36
Lubię używać rails-settings dla globalnych wartości konfiguracyjnych, które muszą być zmieniane przez interfejs WWW.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-20 12:25:29
Coś, co zaczęliśmy robić w pracy, to Activesupport uporządkowany Hash
Który pozwala na dokładne zdefiniowanie konfiguracji wewnątrz plików środowiska np.
config.service = ActiveSupport::OrderedOptions.new
config.service.api_key = ENV['SERVICE_API_KEY']
config.service.shared_secret = ENV['SERVICE_SHARED_SECRET']
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-26 06:55:47
Sugerowałbym dobre podejście, jak w ogóle radzić sobie z konfiguracją w Twojej aplikacji. Istnieją trzy podstawowe zasady:
- zmień konfigurację a nie kod;
- Użyj konfiguracji ponad warunkami;
- Napisz kod, który coś znaczy.
Aby uzyskać bardziej szczegółowy przegląd kliknij ten link: konfiguracja Rails w odpowiedni sposób
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-24 18:44:41