Najlepszy sposób na stworzenie niestandardowych opcji konfiguracji dla mojej aplikacji Rails?

Muszę utworzyć jedną opcję konfiguracji dla mojej aplikacji Rails. Może być taki sam dla wszystkich środowisk. Odkryłem, że jeśli ustawiłem go w environment.rb, jest on dostępny w moich poglądach, co jest dokładnie tym, czego chcę...

environment.rb

AUDIOCAST_URI_FORMAT = http://blablalba/blabbitybla/yadda
Działa świetnie. Jednak jestem trochę niespokojny. Czy to dobry sposób, aby to zrobić? Czy jest sposób, który jest bardziej modny?
Author: Ethan, 2009-02-27

14 answers

Dla ogólnej konfiguracji aplikacji, która nie musi być przechowywana w tabeli bazy danych, lubię tworzyć plik config.yml w katalogu config. Dla Twojego przykładu może to wyglądać tak:

defaults: &defaults
  audiocast_uri_format: http://blablalba/blabbitybla/yadda

development:
  <<: *defaults

test:
  <<: *defaults

production:
  <<: *defaults

Ten plik konfiguracyjny zostanie załadowany z niestandardowego inicjalizatora w config / initializers :

# Rails 2
APP_CONFIG = YAML.load_file("#{RAILS_ROOT}/config/config.yml")[RAILS_ENV]

# Rails 3+
APP_CONFIG = YAML.load_file(Rails.root.join('config/config.yml'))[Rails.env]

Jeśli używasz Rails 3, Upewnij się, że nie dodasz przypadkowo ukośnika do swojej względnej ścieżki konfiguracji.

Możesz następnie pobrać wartość użycie:

uri_format = APP_CONFIG['audiocast_uri_format']
Zobacz

Ten Railscastaby uzyskać szczegółowe informacje.

 189
Author: John Topley,
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
2016-07-10 02:31:12

Rails 3 wersja kodu inicjującego jest następująca (rails_root & RAILS_ENV są przestarzałe)

APP_CONFIG = YAML.load_file(Rails.root.join('config', 'config.yml'))[Rails.env]

Również Ruby 1.9.3 używa Psych, co uwrażliwia wielkość liter kluczy scalających, więc musisz zmienić plik konfiguracyjny, aby wziąć to pod uwagę, np.

defaults: &DEFAULTS
  audiocast_uri_format: http://blablalba/blabbitybla/yadda

development:
  <<: *DEFAULTS

test:
  <<: *DEFAULTS

production:
  <<: *DEFAULTS
 82
Author: David Burrows,
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-02-27 16:55:45

Szyny >= 4.2

Wystarczy utworzyć plik YAML do katalogu config/, na przykład: config/neo4j.yml.

Zawartość neo4j.yml może być taka jak poniżej (dla uproszczenia użyłem domyślnego dla wszystkich środowisk):

default: &default
  host: localhost
  port: 7474
  username: neo4j
  password: root

development:
  <<: *default

test:
  <<: *default

production:
  <<: *default

W config/application.rb:

module MyApp
  class Application < Rails::Application
    config.neo4j = config_for(:neo4j)
  end
end

Teraz Twój niestandardowy config jest dostępny jak poniżej:

Rails.configuration.neo4j['host'] #=>localhost
Rails.configuration.neo4j['port'] #=>7474

Więcej informacji

Rails oficjalny dokument API opisuje metodę config_for jako:

Wygoda załadunku config / foo.yml dla bieżącego Rails env.


Jeśli nie chcesz używać pliku yaml

Jak mówi oficjalny przewodnik Rails:

Możesz skonfigurować swój własny kod poprzez obiekt rails configuration z niestandardową konfiguracją pod właściwością config.x.

Przykład

config.x.payment_processing.schedule = :daily
config.x.payment_processing.retries  = 3
config.x.super_debugger = true

Te punkty konfiguracyjne są następnie dostępne poprzez konfigurację obiekt:

Rails.configuration.x.payment_processing.schedule # => :daily
Rails.configuration.x.payment_processing.retries  # => 3
Rails.configuration.x.super_debugger              # => true
Rails.configuration.x.super_debugger.not_set      # => nil

Oficjalne odniesienie do metody config_for | Official Rails Guide

 41
Author: Ali MasudianPour,
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-03-04 06:02:06

Krok 1: Utwórz config/initializers / appconfig.rb

require 'ostruct'
require 'yaml'

all_config = YAML.load_file("#{Rails.root}/config/config.yml") || {}
env_config = all_config[Rails.env] || {}
AppConfig = OpenStruct.new(env_config)

Krok 2: Utwórz config / config.yml

common: &common
  facebook:
    key: 'asdjhasxas'
    secret : 'xyz'
  twitter:
    key: 'asdjhasxas'
    secret : 'abx'

development:
  <<: *common

test:
  <<: *common

production:
  <<: *common

Krok 3: Pobierz stałe w dowolnym miejscu kodu

facebook_key = AppConfig.facebook['key']
twitter_key  = AppConfig.twitter['key']
 24
Author: Omer Aslam,
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-02-09 13:27:41

Chciałem tylko zaktualizować to dla najnowszych fajnych rzeczy w Rails 4.2 i 5, Teraz możesz to zrobić w dowolnym pliku config/**/*.rb:

config.x.whatever = 42

(i to jest literalne x tam, tj. config.x. dosłownie to musi być, a potem możesz dodać co chcesz po x)

...i to będzie dostępne w aplikacji jako:

Rails.configuration.x.whatever

Zobacz więcej tutaj: http://guides.rubyonrails.org/configuring.html#custom-configuration

 17
Author: smathy,
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-03-29 15:16:23

Tylko kilka dodatkowych informacji na ten temat:

APP_CONFIG = YAML.load_file(Rails.root.join('config', 'config.yml'))[Rails.env].with_indifferent_access

".with_indifferent_access " umożliwia dostęp do wartości w hash za pomocą klucza łańcuchowego lub równoważnego klucza symbolu.

Np.
APP_CONFIG['audiocast_uri_format'] => 'http://blablalba/blabbitybla/yadda' APP_CONFIG[:audiocast_uri_format] => 'http://blablalba/blabbitybla/yadda'

To tylko wygoda, ale wolę, żeby moje klucze były symbolami.
 6
Author: foomip,
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-11-14 06:29:56

Używam czegoś podobnego do Johna dla Rails 3.0/3.1, ale erb najpierw parsuje plik:

APP_CONFIG = YAML.load(ERB.new(File.new(File.expand_path('../config.yml', __FILE__)).read).result)[Rails.env]

To pozwala mi używać ERB w moim config, jeśli muszę, jak czytanie heroku redistogo url:

production:
  <<: *default
  redis:                  <%= ENV['REDISTOGO_URL'] %>
 5
Author: Jack Chu,
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-08-11 16:11:17

Rails 4

Aby utworzyć niestandardową konfigurację yaml i załadować ją (i udostępnić swojej aplikacji) w podobny sposób jak database_configuration.

Utwórz swój *.yml, w moim przypadku potrzebowałem pliku konfiguracyjnego redis.

config/redis.yml

default: &default
  host: localhost
  port: 6379

development:
  <<: *default

test:
  <<: *default

production:
  <<: *default
  host: <%= ENV['ELASTICACHE_HOST'] %>
  port: <%= ENV['ELASTICACHE_PORT'] %>

Następnie załaduj konfigurację

config/application.rb

module MyApp
  class Application < Rails::Application

    ## http://guides.rubyonrails.org/configuring.html#initialization-events
    config.before_initialize do
      Rails.configuration.redis_configuration = YAML.load_file("#{Rails.root}/config/redis.yml")
    end

  end
end

Dostęp do wartości:

Rails.configuration.redis_configuration[Rails.env] podobne do jak możesz mieć dostęp do swojego database.yml przez Rails.configuration.database_configuration[Rails.env]

 2
Author: twmulloy,
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-03-20 19:21:57

Bazując na eleganckim rozwiązaniu Omer Aslam, postanowiłem zamienić klucze na symbole. Jedyna zmiana to:

all_config = YAML.load_file("#{Rails.root}/config/config.yml").with_indifferent_access || {}

Pozwala to na odwoływanie się do wartości za pomocą symboli jako kluczy, np.

AppConfig[:twitter][:key]
To wydaje mi się schludniejsze dla moich oczu.

(Posted as an answer as my reputation isn 't such high to comment on Omer' s reply)

 1
Author: Kitebuggy,
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
2016-01-02 17:18:13

Lubię simpleconfig. Pozwala na konfigurację środowiska.

 0
Author: Jerry Cheung,
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-03-03 22:58:47

Zobacz moją odpowiedź na Gdzie najlepiej przechowywać parametry aplikacji: baza danych, plik, kod...?

Odmiana tego, co miałeś w tym, że jest to proste odniesienie do innego pliku. Widzi to środowisko.RB nie jest stale aktualizowany i nie ma sterty konkretnych rzeczy w aplikacji. Chociaż nie jest to konkretna odpowiedź na twoje pytanie " czy to droga szynowa?', być może będzie tam jakaś dyskusja na ten temat.

 0
Author: Straff,
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:17:42

Preferuję dostęp do ustawień poprzez globalny stos aplikacji. Unikam nadmiernych zmiennych globalnych w zasięgu lokalnym.

Config/initializers / myconfig.rb

MyAppName::Application.define_singleton_method("myconfig") {YAML.load_file("#{Rails.root}/config/myconfig.yml") || {}}

I uzyskać do niego dostęp.

MyAppName::Application.myconfig["yamlstuff"]
 0
Author: 6ft Dan,
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-09-20 04:33:10

Mój sposób na załadowanie ustawień przed zainicjalizowaniem Rails

Pozwala używać ustawień w inicjalizacji Rails i konfigurować ustawienia dla środowiska

# config/application.rb
Bundler.require(*Rails.groups)

mode = ENV['RAILS_ENV'] || 'development'
file = File.dirname(__FILE__).concat('/settings.yml')
Settings = YAML.load_file(file).fetch(mode)
Settings.define_singleton_method(:method_missing) {|name| self.fetch(name.to_s, nil)}

Można uzyskać ustawienia na dwa sposoby: Settings ['email'] lub Settings.e-mail

 0
Author: greenif,
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-03-19 17:51:59

Mój najlepszy sposób na niestandardową konfigurację, z Komunikatem raise podczas ustawiania.yml zaginął.

Jest ładowany z niestandardowego inicjalizatora w config/initializers / custom_config.rb

setting_config = File.join(Rails.root,'config','setting.yml')
raise "#{setting_config} is missing!" unless File.exists? setting_config
config = YAML.load_file(setting_config)[Rails.env].symbolize_keys

@APP_ID = config[:app_id]
@APP_SECRET = config[:app_secret]

Utwórz YAML w config / setting.yml

development:
  app_id: 433387212345678
  app_secret: f43df96fc4f65904083b679412345678

test:
  app_id: 148166412121212
  app_secret: 7409bda8139554d11173a32222121212

production:
  app_id: 148166412121212
  app_secret: 7409bda8139554d11173a32222121212
 0
Author: Marcelo Austria,
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-04-07 07:15:48