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

300

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

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

  • 1
    Дубликат: stackoverflow.com/questions/592554/…
  • 0
    Немного связано: не забудьте перезапустить сервер при добавлении новых переменных конфигурации.
Теги:
configuration

13 ответов

159
Лучший ответ

Обновление 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
  • 7
    +1 за эту ссылку!
  • 0
    Это было действительно полезно, именно то, что я хотел ... Спасибо !!!
Показать ещё 7 комментариев
359

В 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

Изображение 4156

  • 0
    Это не похоже на работу. Я не могу ссылаться на переменную где-либо еще в приложении. Также нет упоминания о возможности сделать это здесь: guides.rubyonrails.org/configuring.html
  • 11
    Меня устраивает. Я поместил параметры конфигурации, специфичные для моей среды, в environment / {environment} .rb, например, environment / development.rb. Убедитесь, что вы перезапустите свой сервер после внесения изменений. Могут быть более элегантные методы, но я обновляю существующее приложение, которое ранее использовало ENV ['XXX'] в том же файле, и, поскольку я хочу ограничить количество рефакторинга во время обновления, это сработало хорошо.
Показать ещё 20 комментариев
67

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

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

config.custom_config_key = :config_value

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

Rails.application.config.custom_config_key
  • 4
    Помните, что если вы устанавливаете что-то только в производственной среде и пытаетесь получить к нему доступ в другой среде, это приведет к появлению undefined method .
  • 0
    Я пробовал это в rails 4.1, и я получаю ошибки: "... method_missing': undefined method хранилище method_missing': undefined method " для # <Rails :: Application :: Configuration: 0x007f9f735b7240> ... ". Я пытался добавить переменную config.store.works.
Показать ещё 2 комментария
30

Это работает в рельсах 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
  • 2
    camelCase: o использовать snake_case!
18

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

10

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

9

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

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

4

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

4

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

https://github.com/binarylogic/settingslogic

  • 2
    Люблю это до сих пор. Помещение вашего объекта настроек в app / models / settings.rb также приводит к перезагрузке в режиме разработки. Выиграть!
4

Я создал простой плагин для настроек 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.

  • 0
    Официальный репозиторий теперь находится по адресу: github.com/charlotte-ruby/yettings (так что рецензент отклонил мое редактирование, сказав, что оно слишком незначительное)
2

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

  • 2
    Я не хочу использовать дополнительные плагины и т. Д., Поскольку я изучаю рельсы, так что лучший способ сделать это был бы без каких-либо плагинов.
  • 0
    Обратите внимание, что для хранения конфигураций используется база данных, которая может быть слишком тяжелой для некоторых людей.
-3

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

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню