Как определить пользовательские переменные конфигурации в рельсах

Мне было интересно, как добавить пользовательские переменные конфигурации в приложение rails и как получить к ним доступ в контроллере, например, я хочу иметь возможность определить upload_directory в файлах конфигурации, например, development.rb, и получить доступ к ним в одном из моих контроллеры.

Во-вторых, я планировал иметь поддержку S3 для загрузки в мое приложение, если я хотел добавить файл yaml с доступом к s3, секретным ключом, как мне инициализировать его в моем приложении Rails и как получить доступ к значениям, которые я определил в этом конфигурационном файле.

15 ответов

Решение

Обновление 1

Очень рекомендую: сейчас я собираюсь использовать Rails Config gem для тонкого контроля, который он обеспечивает.

Update2

Если вы хотите быстрое решение, то проверьте ответ Джека Пратта ниже.

Хотя мой оригинальный ответ ниже все еще работает, этот ответ устарел. Я рекомендую посмотреть на обновления 1 и 2.

Оригинальный ответ:

Для быстрого решения очень полезно посмотреть на экран "Файл конфигурации YAML", созданный Райаном Бейтсом.

В итоге:

# config/initializers/load_config.rb
APP_CONFIG = YAML.load_file("#{Rails.root}/config/config.yml")[Rails.env]

# application.rb
if APP_CONFIG['perform_authentication']
  # Do stuff
end

В Rails 3 специальные пользовательские данные конфигурации приложения могут быть помещены в объект конфигурации приложения. Конфигурация может быть назначена в файлах инициализации или файлах среды - скажем, для данного приложения MyApp:

MyApp::Application.config.custom_config_variable = :my_config_setting

или же

Rails.configuration.custom_config_variable = :my_config_setting

Чтобы прочитать настройку, просто вызовите переменную конфигурации, не устанавливая ее:

Rails.configuration.custom_config_variable
=> :my_config_setting

ОБНОВЛЕНИЕ Rails 4

В Rails 4 появился новый способ для этого => http://guides.rubyonrails.org/configuring.html

В Rails 3.0.5 у меня работал следующий подход:

В config/environments/development.rb, записывать

config.custom_config_key = :config_value

Значение custom_config_key затем можно ссылаться из других файлов, используя

Rails.application.config.custom_config_key

В Rails 4

Предполагая, что вы поместили свои пользовательские переменные в файл yaml:

# config/acme.yml
development:
  :api_user: 'joe'
  :api_pass: 's4cret'
  :timeout: 20

Создайте инициализатор для их загрузки:

# config/initializers/acme.rb
acme_config = Rails.application.config_for :acme

Rails.application.configure do
  config.acme = ActiveSupport::OrderedOptions.new
  config.acme.api_user = acme_config[:api_user]
  config.acme.api_pass = acme_config[:api_pass]
  config.acme.timeout  = acme_config[:timeout]
end

Теперь в любом месте вашего приложения вы можете получить доступ к этим значениям следующим образом:

Rails.configuration.acme.api_user

Это удобно, что Rails.application.config_for :acme загрузит ваш acme.yml и использовать правильную среду.

Это работает в рельсах 3.1:

в config/environment.rb (или в config / средах /.. для определения конкретной среды):

YourApp::Application.config.yourKey = 'foo'

Это будет доступно в контроллере или представлениях как это:

YourApp::Application.config.yourKey

(Ваше приложение должно быть заменено именем вашего приложения.)

Примечание: это код Ruby, поэтому, если у вас много ключей конфигурации, вы можете сделать это:

в config / environment.rb:

YourApp::Application.configure do
  config.something = foo
  config.....
  config....
  .
  config....
end

Начиная с Rails 4.2, без дополнительных гемов, вы можете загрузить config/hi.yml просто используя Rails.application.config_for :hi,

Например:

  1. touch config/passwords.yml

        #config/passwords.yml
        development:
          username: 'a'
          password: 'b'
        production:
          username: 'aa'
          password: 'bb'
    
  1. touch config/initializers/constants.rb

    #config/initializers/constants.rb
    AUTHENTICATION = Rails.application.config_for :passwords
    
  1. и теперь вы можете использовать AUTHENTICATION постоянная везде в вашем приложении:

    #rails c production
    :001> AUTHENTICATION['username'] => 'aa'
    
  2. затем добавьте passwords.yml в .gitignore: echo /config/passwords.yml >> .gitignoreсоздайте файл примера для вашего удобства cp /config/passwords.yml /config/passwords.example.yml а затем просто отредактируйте файл примера в рабочей консоли, указав фактические производственные значения.

Рельсы 6

Многие устаревшие ответы, поэтому добавляем тот, который специфичен для Rails 6.

Конфигурация для конкретного приложения находится в файлах инициализатора. Подробности здесь: направляющие кромки

Пример:

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

      module MyApp
  class Application < Rails::Application
    config.test_val = 'foo'
  end
end

Альтернативно:

      Rails.application.config.test_val = 'foo'

Теперь к нему можно получить доступ как:

      Rails.configuration.test_val

Еще много возможностей.направляющие края #custom-configuration

ex, вы также можете настроить конфигурации вложенного пространства имен:

      config.x.payment_processing.schedule = :daily
config.x.payment_processing.retries  = 3
config.super_debugger = true

или используйте config_for для загрузки целых пользовательских файлов конфигурации:

config / payment.yml

      production:
  environment: production
  merchant_id: production_merchant_id
  public_key:  production_public_key
  private_key: production_private_key

development:
  environment: sandbox
  merchant_id: development_merchant_id
  public_key:  development_public_key
  private_key: development_private_key

Затем загрузите его:

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

      module MyApp
  class Application < Rails::Application
    config.payment = config_for(:payment)
  end
end

Я просто хотел обновить это для последней крутой вещи в Rails 4.2, теперь вы можете сделать это в любом из ваших config/**/*.rb файлы:

config.x.whatever.you.want = 42

... и это будет доступно в вашем приложении как:

Rails.configuration.x.whatever.you.want

Подробнее здесь: http://guides.rubyonrails.org/configuring.html

Проверьте этот аккуратный драгоценный камень, делающий именно это: https://github.com/mislav/choices

Таким образом, ваши конфиденциальные данные не будут представлены в проектах с открытым исходным кодом.

Мне очень нравится настройка логического драгоценного камня. Очень прост в настройке и использовании.

https://github.com/binarylogic/settingslogic

Я создал простой плагин для настроек YAML: Йеттингс

Он работает аналогично коду в ответе khelll, но вам нужно только добавить этот файл конфигурации YAML:

app/config/yetting.yml

Плагин динамически создает класс, который позволяет вам получить доступ к настройкам YML как методы класса в вашем приложении, например, так:

Yetting.your_setting

Кроме того, если вы хотите использовать несколько файлов настроек с уникальными именами, вы можете поместить их в подкаталог в app / config следующим образом:

app/config/yettings/first.yml
app/config/yettings/second.yml

Затем вы можете получить доступ к значениям, как это:

FirstYetting.your_setting
SecondYetting.your_setting

Он также предоставляет вам настройки по умолчанию, которые могут быть переопределены для каждой среды. Вы также можете использовать erb внутри файла yml.

Если вы используете Heroku или иным образом должны сохранять настройки приложения в качестве переменных среды, драгоценность figaro очень полезна.

Мне нравится использовать rails-settings для глобальных значений конфигурации, которые должны быть изменены через веб-интерфейс.

Что-то, что мы начинаем делать на работе, это ActiveSupport Ordered Hash

Что позволяет вам четко определить вашу конфигурацию в файлах среды, например

config.service = ActiveSupport::OrderedOptions.new
config.service.api_key = ENV['SERVICE_API_KEY']
config.service.shared_secret = ENV['SERVICE_SHARED_SECRET']

Я бы посоветовал хороший подход к настройке вашего приложения вообще. Есть три основных правила:

  • измените свою конфигурацию, а не код;
  • использовать конфигурации сверх условий;
  • написать код, который что-то значит.

Чтобы получить более подробный обзор, перейдите по этой ссылке: Правильно настроить Rails

Другие вопросы по тегам