Мне нужно создать один вариант конфигурации для моего приложения Rails. Он может быть одинаковым для всех сред. Я обнаружил, что если я установил его в environment.rb
, он доступен в моих представлениях, что именно то, что я хочу...
environment.rb
AUDIOCAST_URI_FORMAT = http://blablalba/blabbitybla/yadda
Отлично работает.
Однако, я немного неспокойный. Это хороший способ сделать это? Есть ли способ, что больше бедра?
Для общей конфигурации приложения, которую не нужно хранить в таблице базы данных, мне нравится создавать файл 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.
Версия кода инициализации 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
"#{Rails.root.to_s}"
; "#{Rails.root}"
работает.
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
Шаг 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']
Я просто хотел обновить это для последних интересных вещей в 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
x
.
Просто дополнительная информация по этой теме:
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'
Чисто удобная вещь, но я предпочитаю, чтобы мои ключи представлялись в виде символов.
Я использую нечто похожее на 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'] %>
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]
Rails.configuration.redis_configuration = YAML.load_file("#{Rails.root}/config/redis.yml")[Rails.env]
. Однако в рельсах 4.2 и выше ответ смати, вероятно, является более простым способом.
Основываясь на элегантном решении Omer Aslam, я решил преобразовать ключи в символы. Единственное изменение:
all_config = YAML.load_file("#{Rails.root}/config/config.yml").with_indifferent_access || {}
Это позволяет вам ссылаться на значения по символам в виде клавиш, например
AppConfig[:twitter][:key]
Это кажется мне более аккуратным.
(Отправленный как ответ, поскольку моя репутация недостаточно высока, чтобы комментировать ответ Омера)
Мой лучший способ настраивать конфигурацию с сообщением о повышении, если параметр 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
Позволяет использовать параметры в инициализации 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'] или Настройки.
Я предпочитаю доступ к настройкам через глобальный стек приложений. Я избегаю избыточных глобальных переменных в локальной области.
конфигурации/инициализаторы/myconfig.rb
MyAppName::Application.define_singleton_method("myconfig") {YAML.load_file("#{Rails.root}/config/myconfig.yml") || {}}
И получите доступ к нему.
MyAppName::Application.myconfig["yamlstuff"]
см. мой ответ Где лучшее место для хранения параметров приложения: база данных, файл, код...?
Вариант того, что у вас было, что это простая ссылка на другой файл. Он видит, что environment.rb не постоянно обновляется и не содержит кучу конкретных приложений. Хотя не конкретный ответ на ваш вопрос о том, "это путь Rails?", Возможно, там будет обсуждение об этом.
Мне нравится simpleconfig. Он позволяет иметь конфигурацию среды.
YAML::ENGINE.yamler = 'syck'
чтобы это работало stackoverflow.com/a/6140900/414220