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