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


337

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

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



Немного связано: не забудьте перезапустить сервер при добавлении новых переменных конфигурации.
Дэмиен Ó Силай

Ответы:


165

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

62
Этот ответ устарел. См stackoverflow.com/questions/1450285/... ниже
mattwynne

8
@matt: Это устарело, потому что был выпущен Rails 3, или потому что все сейчас на Rails 3, или ...?
Лассе В. Карлсен

Спасибо за указание на устаревшее. Я ненавижу то, что насчет Rails - код от 1 года назад слишком стар.
Jcollum

2
Для тех, кто хочет использовать метод YAML в Rails 3+, вам придется заменить RAILS_ENVна Rails.envи RAILS_ROOTна Rails.root.
Райан

Я попробовал rails_config. В документации они инструктируют меня зарегистрировать RailsConfig в моем app.rb. Я предполагаю, что app.rb = config / application.rb. Но где в application.rb я должен поместить строку реестра RailsConfig?
Ним Хо Бао

375

В 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#custom-configuration

введите описание изображения здесь


11
Меня устраивает. Я поместил параметры конфигурации, специфичные для моей среды, в environment / {environment} .rb, например, environment / development.rb. Убедитесь, что вы перезапустите свой сервер после внесения изменений. Могут быть более элегантные методы, но я обновляю существующее приложение, которое ранее использовало ENV ['XXX'] в том же файле, и, поскольку я хочу ограничить количество рефакторинга во время обновления, это сработало хорошо.
pduey

13
Это задание, но как вам получить доступ к этому значению?
kevzettler

9
Если вы посмотрите в application.rb приложения rails 3.x, в нем будет написано «Конфигурация приложения должна входить в файлы в config / initializer» согласно этому ответу. Существует множество документов о том, как получить доступ к переменной ( edgeguides.rubyonrails.org/configuring.html ). например, в файле с именем some_variables.rb в папке initializer поместите переменную, как описано выше (заменив MyApp именем вашего приложения), затем, когда вы захотите ее использовать, просто вызовите config.custom_config_variable. Конечно, вы можете использовать любое имя переменной, которое вам нравится. , @ Джек Пратт, ты мог бы отредактировать более полный ответ?
Jamesc

48
Чувак, просто: Путь: config/environments/production.rb Конфиг: config.whatever = false Доступ к нему везде: Rails.configuration.whatever
Виктор С

5
Помните, что если вы устанавливаете что-то только в рабочей среде и пытаетесь получить к нему доступ в другой среде, это может привести к жалобам undefined method.
Лулалала

69

В 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.
Лулалала

Я пробовал это в rails 4.1, и я получаю ошибки: "... method_missing': undefined method store" для # <Rails :: Application :: Configuration: 0x007f9f735b7240> ... ". Я пытался добавить конфигурационную переменную "config.store.works".
Spundun

1
@Spundun Вы получаете эту ошибку, потому что Rails не знает, что это storeтакое. Чтобы использовать метод в этом ответе, вы можете либо переименовать вашу переменную store_works, либо создать config.storeблок с worksопределенным в нем.
Пол Петтенгилл

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

31

Это работает в рельсах 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

2
camelCase: o использовать snake_case!
siegy22

30

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


21

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


13

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

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


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

4

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

https://github.com/binarylogic/settingslogic


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

4

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


2

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


2
Я не хочу использовать дополнительные плагины и т. Д., Поскольку я изучаю рельсы, так что лучший способ сделать это будет без каких-либо плагинов.
Шив

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

0

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

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

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

-5

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

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.