Лучший способ создания настраиваемых параметров конфигурации для моего приложения 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