Лучший способ создать пользовательские параметры конфигурации для моего приложения Rails?
мне нужно создать один параметр конфигурации для моего приложения Rails. Она может быть одинаковой для всех сред. Я нашел это, если я установил его в environment.rb
, он доступен в моих представлениях, что именно то, что я хочу...
environment.rb
AUDIOCAST_URI_FORMAT = http://blablalba/blabbitybla/yadda
работает отлично.
однако мне немного не по себе. Это хороший способ сделать это? Есть ли способ быть более модным?
14 ответов
для общей конфигурации приложения, которая не должна храниться в таблице базы данных, мне нравится создавать . Для вашего примера, это может выглядеть так:
defaults: &defaults
audiocast_uri_format: http://blablalba/blabbitybla/yadda
development:
<<: *defaults
test:
<<: *defaults
production:
<<: *defaults
этот файл конфигурации загружается из пользовательского инициализатора в в config/инициализаторы:
# 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
рельсы >= 4.2
создать на , например: 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
метод as:
удобство загрузки config/foo.yml для текущего Rails env.
если вы не хотите использовать
как говорит официальный гид 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
метод |
Официальный Направляющий Выступ Рельсов
Шаг 1: создать файл config/инициализаторы/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.в формате 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
В есть, то есть. the config.x.
буквально следует, что, а затем вы можете добавить все, что вы хотите после x
)
...и это будет доступно в вашем приложении как:
Rails.configuration.x.whatever
подробнее здесь: http://guides.rubyonrails.org/configuring.html#custom-configuration
просто дополнительная информация по этой теме:
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 для 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 в моей конфигурации, если мне нужно, например, прочитать redistogo url heroku:
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
by Rails.configuration.database_configuration[Rails.env]
all_config = YAML.load_file("#{Rails.root}/config/config.yml").with_indifferent_access || {}
Это позволяет вам ссылаться на значения символами в качестве ключей, например
AppConfig[:twitter][:key]
это кажется более аккуратным для моих глаз.
(опубликовано в качестве ответа, поскольку моя репутация недостаточно высока, чтобы прокомментировать ответ Омера)
Мне нравится simpleconfig. Это позволяет иметь конфигурацию для каждой среды.
см. Мой ответ где лучше всего хранить параметры приложения: база данных, файл, код...?
вариант того, что у вас было в том, что это простая ссылка на другой файл. Он видит эту среду.rb не постоянно обновляется и не имеет кучу конкретных приложений в нем. Хоть и не конкретный ответ на ваш вопрос-это как рельсы?- может быть, об этом и пойдет речь.
Я предпочитаю доступ к настройкам через глобальный стек приложений. Я избегаю избыточных глобальных переменных в локальной области.
config / инициализаторы / myconfig.rb
MyAppName::Application.define_singleton_method("myconfig") {YAML.load_file("#{Rails.root}/config/myconfig.yml") || {}}
и получить к нему доступ.
MyAppName::Application.myconfig["yamlstuff"]
мой способ загрузить настройки перед инициализацией 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'] или настройки.электронная почта
мой лучший способ настроить конфигурацию, с сообщением о повышении при настройке.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