Лучший способ создать пользовательские параметры конфигурации для моего приложения Rails?

118

Мне нужно создать один вариант конфигурации для моего приложения Rails. Он может быть одинаковым для всех сред. Я обнаружил, что если я установил его в environment.rb, он доступен в моих представлениях, что именно то, что я хочу...

environment.rb

AUDIOCAST_URI_FORMAT = http://blablalba/blabbitybla/yadda

Отлично работает.

Однако, я немного неспокойный. Это хороший способ сделать это? Есть ли способ, что больше бедра?

Теги:
configuration
environment

14 ответов

174
Лучший ответ

Для общей конфигурации приложения, которую не нужно хранить в таблице базы данных, мне нравится создавать файл 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.

  • 1
    Это действительно круто.
  • 1
    Вам может понадобиться YAML::ENGINE.yamler = 'syck' чтобы это работало stackoverflow.com/a/6140900/414220
Показать ещё 9 комментариев
82

Версия кода инициализации 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
  • 0
    Спасибо, это было полезно!
  • 3
    Вам не нужно "#{Rails.root.to_s}" ; "#{Rails.root}" работает.
Показать ещё 4 комментария
34

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

23

Шаг 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']
  • 3
    это выдающееся решение!
  • 0
    Как мы читаем переменную ENV в config.yml, моя конфигурация такая же .. я добавил переменную в bashrc, и я пытаюсь прочитать это в config.yml, используя ключ: <% = ENV [URL]%> ... this не работает
Показать ещё 1 комментарий
16

Я просто хотел обновить это для последних интересных вещей в 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

  • 3
    Просто разъяснение, которое изначально вызвало у меня проблему; х не является заполнителем для того, что вы хотите вставить, это действительно должна быть буква x .
  • 0
    Отличный момент @tobinibot - я добавил это уточнение в свой ответ, спасибо.
Показать ещё 5 комментариев
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'

Чисто удобная вещь, но я предпочитаю, чтобы мои ключи представлялись в виде символов.

5

Я использую нечто похожее на 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'] %>
  • 2
    Я не думаю, что я буду нуждаться в этом каждый день, но это действительно классное решение для тех случаев, когда вам это нужно. Я думаю, что я бы изменил имя файла на config.yml.erb, хотя в соответствии с соглашением Rails.
2

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]

  • 0
    Вы также можете сэкономить некоторое время, взяв только настройки для вашей текущей среды, которые, по-видимому, в любом случае вам нужны: Rails.configuration.redis_configuration = YAML.load_file("#{Rails.root}/config/redis.yml")[Rails.env] . Однако в рельсах 4.2 и выше ответ смати, вероятно, является более простым способом.
1

Основываясь на элегантном решении Omer Aslam, я решил преобразовать ключи в символы. Единственное изменение:

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

Это позволяет вам ссылаться на значения по символам в виде клавиш, например

AppConfig[:twitter][:key]

Это кажется мне более аккуратным.

(Отправленный как ответ, поскольку моя репутация недостаточно высока, чтобы комментировать ответ Омера)

0

Мой лучший способ настраивать конфигурацию с сообщением о повышении, если параметр 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
0

Мой способ загрузки настроек перед инициализацией 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'] или Настройки.

0

Я предпочитаю доступ к настройкам через глобальный стек приложений. Я избегаю избыточных глобальных переменных в локальной области.

конфигурации/инициализаторы/myconfig.rb

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

И получите доступ к нему.

MyAppName::Application.myconfig["yamlstuff"]
0

см. мой ответ Где лучшее место для хранения параметров приложения: база данных, файл, код...?

Вариант того, что у вас было, что это простая ссылка на другой файл. Он видит, что environment.rb не постоянно обновляется и не содержит кучу конкретных приложений. Хотя не конкретный ответ на ваш вопрос о том, "это путь Rails?", Возможно, там будет обсуждение об этом.

0

Мне нравится simpleconfig. Он позволяет иметь конфигурацию среды.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню