Как определить пользовательские переменные конфигурации в рельсах - PullRequest
330 голосов
/ 20 сентября 2009

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

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

Ответы [ 14 ]

371 голосов
/ 20 февраля 2011

В 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

ОБНОВЛЕНИЕ Рельсов 4

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

enter image description here

163 голосов
/ 20 сентября 2009

Обновление 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
68 голосов
/ 21 марта 2011

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

В config/environments/development.rb, напишите

config.custom_config_key = :config_value

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

Rails.application.config.custom_config_key
31 голосов
/ 10 января 2012

Это работает в рельсах 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
27 голосов
/ 03 октября 2015

In 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 и будет использовать правильную среду.

19 голосов
/ 29 июля 2015

Начиная с 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, а затем просто отредактируйте файл примера в своем производственная консоль с фактическими значениями производства.

12 голосов
/ 30 января 2015

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

config.x.whatever.you.want = 42

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

Rails.configuration.x.whatever.you.want

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

8 голосов
/ 30 сентября 2011

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

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

4 голосов
/ 18 января 2013

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

4 голосов
/ 08 июня 2011

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

https://github.com/binarylogic/settingslogic

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...