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

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

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

Ответ 1

Обновление 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

Ответ 2

В 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

UPDATE Rails 4

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

enter image description here

Ответ 3

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

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

config.custom_config_key = :config_value

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

Rails.application.config.custom_config_key

Ответ 4

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

в config/environment.rb(или в config/environment/.. для целевой среды):

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

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

YourApp::Application.config.yourKey

(YourApp следует заменить на ваше имя приложения.)

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

в config/environment.rb:

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

Ответ 5

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

Ответ 6

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

Например:

  • 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. и теперь вы можете использовать константу AUTHENICATION всюду в своем приложении:

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

Ответ 7

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

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

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

Ответ 9

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

Он работает аналогично коду в ответе 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.

Ответ 11

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

Ответ 12

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

Ответ 13

Я хотел бы предложить хороший подход, как вообще иметь дело с конфигурацией в вашем приложении. Существует три основных правила:

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

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