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

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

environment.rb

AUDIOCAST_URI_FORMAT = http://blablalba/blabbitybla/yadda

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

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

Ответы [ 14 ]

189 голосов
/ 27 февраля 2009

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

82 голосов
/ 18 января 2011

Версия кода инициализатора 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
48 голосов
/ 16 июля 2016

Рельсы> = 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.


Если вы не хотите использовать 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 методу | Официальный путеводитель по рельсам

24 голосов
/ 09 февраля 2013

Шаг 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']
17 голосов
/ 30 января 2015

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

Просто дополнительная информация по этой теме:

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 голосов
/ 11 августа 2011

Я использую что-то похожее на 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 в моем конфиге, если мне нужно, например, чтение повторного URL-адреса heroku:

production:
  <<: *default
  redis:                  <%= ENV['REDISTOGO_URL'] %>
2 голосов
/ 20 марта 2015

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]

1 голос
/ 02 января 2016

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

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

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

AppConfig[:twitter][:key]

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

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

0 голосов
/ 07 апреля 2017

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