Лучший способ создания настраиваемых параметров конфигурации для моего приложения Rails?
Мне нужно создать один вариант конфигурации для моего приложения Rails. Он может быть одинаковым для всех сред. Я обнаружил, что если я установил его в environment.rb
, он доступен в моих представлениях, что именно то, что я хочу...
environment.rb
AUDIOCAST_URI_FORMAT = http://blablalba/blabbitybla/yadda
Отлично работает.
Однако, я немного неспокойный. Это хороший способ сделать это? Есть ли способ, что больше бедра?
Ответы
Ответ 1
Для общей конфигурации приложения, которую не нужно хранить в таблице базы данных, мне нравится создавать файл config.yml
в каталоге config. Для вашего примера это может выглядеть так:
defaults: &defaults
audiocast_uri_format: http://blablalba/blabbitybla/yadda
development:
<<: *defaults
test:
<<: *defaults
production:
<<: *defaults
Этот файл конфигурации загружается из пользовательского инициализатора в 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]
Если вы используете Rails 3, убедитесь, что вы случайно не добавляете ведущую косую черту в свой относительный путь конфигурации.
Затем вы можете получить значение с помощью:
uri_format = APP_CONFIG['audiocast_uri_format']
Подробнее см. этот Railscast.
Ответ 2
Версия кода инициализации Rails 3 выглядит следующим образом (RAILS_ROOT и RAILS_ENV устарели)
APP_CONFIG = YAML.load_file(Rails.root.join('config', 'config.yml'))[Rails.env]
Кроме того, Ruby 1.9.3 использует Psych, который делает чувствительные ключи слияния чувствительными, поэтому вам нужно будет изменить ваш файл конфигурации, чтобы принять это во внимание, например.
defaults: &DEFAULTS
audiocast_uri_format: http://blablalba/blabbitybla/yadda
development:
<<: *DEFAULTS
test:
<<: *DEFAULTS
production:
<<: *DEFAULTS
Ответ 3
Rails 5, Rails 4.2
Просто создайте файл YAML
в каталоге config/
, например: config/neo4j.yml
.
Содержимое neo4j.yml
может быть чем-то вроде ниже (для простоты я использовал значение по умолчанию для всех сред):
default: &default
host: localhost
port: 7474
username: neo4j
password: root
development:
<<: *default
test:
<<: *default
production:
<<: *default
в config/application.rb
:
module MyApp
class Application < Rails::Application
config.neo4j = config_for(:neo4j)
end
end
Теперь ваша пользовательская конфигурация доступна, как показано ниже:
Rails.configuration.neo4j['host'] #=>localhost
Rails.configuration.neo4j['port'] #=>7474
Дополнительная информация
Официальный документ API Rails описывает метод config_for
как:
Удобство для загрузки config/foo.yml для текущего Rails env.
Если вы не хотите использовать файл YAML
Как сообщает официальное руководство Rails:
Вы можете настроить свой собственный код через объект конфигурации Rails с пользовательской настройкой в свойстве config.x
.
Пример
config.x.payment_processing.schedule = :daily
config.x.payment_processing.retries = 3
config.x.super_debugger = true
Эти точки конфигурации затем доступны через объект конфигурации:
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
Официальная ссылка для метода config_for
|
Официальное руководство по Rails
Ответ 4
Шаг 1: Создать конфигурацию/инициализаторы/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)
Шаг 2: Создать config/config.yml
common: &common
facebook:
key: 'asdjhasxas'
secret : 'xyz'
twitter:
key: 'asdjhasxas'
secret : 'abx'
development:
<<: *common
test:
<<: *common
production:
<<: *common
Шаг 3: Получить константы в любом месте кода
facebook_key = AppConfig.facebook['key']
twitter_key = AppConfig.twitter['key']
Ответ 5
Я просто хотел обновить это для последних интересных вещей в Rails 4.2 и 5, теперь вы можете сделать это в любом из ваших файлов config/**/*.rb
:
config.x.whatever = 42
(и что там буквальный x
, т.е. config.x.
буквально должен быть таким, а затем вы можете добавить все, что захотите, после x
)
... и это будет доступно в вашем приложении как:
Rails.configuration.x.whatever
Подробнее здесь: http://guides.rubyonrails.org/configuring.html#custom-configuration
Ответ 6
Просто дополнительная информация по этой теме:
APP_CONFIG = YAML.load_file(Rails.root.join('config', 'config.yml'))[Rails.env].with_indifferent_access
". with_indifferent_access" позволяет получить доступ к значениям в хеш с помощью строкового ключа или с эквивалентным символьным ключом.
например.
APP_CONFIG['audiocast_uri_format'] => 'http://blablalba/blabbitybla/yadda'
APP_CONFIG[:audiocast_uri_format] => 'http://blablalba/blabbitybla/yadda'
Чисто удобная вещь, но я предпочитаю, чтобы мои ключи представлялись в виде символов.
Ответ 7
Я использую нечто похожее на John for Rails 3.0/3.1, но сначала у меня есть erb:
APP_CONFIG = YAML.load(ERB.new(File.new(File.expand_path('../config.yml', __FILE__)).read).result)[Rails.env]
Это позволяет мне использовать ERB в моей конфигурации, если мне нужно, например, читать URL-адрес героя redistogo:
production:
<<: *default
redis: <%= ENV['REDISTOGO_URL'] %>
Ответ 8
Rails 4
Чтобы создать пользовательскую конфигурацию yaml и загрузить ее (и сделать доступной для вашего приложения), похожую на database_configuration
.
Создайте свой *.yml
, в моем случае мне нужен файл конфигурации redis.
config/redis.yml
default: &default
host: localhost
port: 6379
development:
<<: *default
test:
<<: *default
production:
<<: *default
host: <%= ENV['ELASTICACHE_HOST'] %>
port: <%= ENV['ELASTICACHE_PORT'] %>
Затем загрузите конфигурацию
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
Доступ к значениям:
Rails.configuration.redis_configuration[Rails.env]
аналогично тому, как вы можете получить доступ к вашему database.yml
на Rails.configuration.database_configuration[Rails.env]
Ответ 9
Основываясь на элегантном решении Omer Aslam, я решил преобразовать ключи в символы. Единственное изменение:
all_config = YAML.load_file("#{Rails.root}/config/config.yml").with_indifferent_access || {}
Это позволяет вам ссылаться на значения по символам в виде клавиш, например
AppConfig[:twitter][:key]
Это кажется мне более аккуратным.
(Отправленный как ответ, поскольку моя репутация недостаточно высока, чтобы комментировать ответ Омера)
Ответ 10
Мне нравится simpleconfig. Он позволяет иметь конфигурацию среды.
Ответ 11
см. мой ответ Где лучшее место для хранения параметров приложения: база данных, файл, код...?
Вариант того, что у вас было, что это простая ссылка на другой файл. Он видит, что environment.rb не постоянно обновляется и не содержит кучу конкретных приложений.
Хотя не конкретный ответ на ваш вопрос о том, "это путь Rails?", Возможно, там будет обсуждение об этом.
Ответ 12
Я предпочитаю доступ к настройкам через глобальный стек приложений. Я избегаю избыточных глобальных переменных в локальной области.
конфигурации/инициализаторы/myconfig.rb
MyAppName::Application.define_singleton_method("myconfig") {YAML.load_file("#{Rails.root}/config/myconfig.yml") || {}}
И получите доступ к нему.
MyAppName::Application.myconfig["yamlstuff"]
Ответ 13
Мой способ загрузки настроек перед инициализацией Rails
Позволяет использовать параметры в инициализации Rails и настраивать параметры для каждой среды
# 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)}
Вы можете получить настройки двумя способами:
Настройки ['email'] или Настройки.
Ответ 14
Мой лучший способ настраивать конфигурацию с сообщением о повышении, если параметр settings.yml отсутствует.
загружается из пользовательского инициализатора в 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]
Создайте YAML в config/setting.yml
development:
app_id: 433387212345678
app_secret: f43df96fc4f65904083b679412345678
test:
app_id: 148166412121212
app_secret: 7409bda8139554d11173a32222121212
production:
app_id: 148166412121212
app_secret: 7409bda8139554d11173a32222121212