Як визначити власні змінні конфігурації в рейках


337

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

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



Трохи пов'язані: Не забудьте перезапустити сервер, додаючи нові змінні конфігурації.
Дамієн Ó Ceallaigh

Відповіді:


165

Оновлення 1

Дуже рекомендується: я зараз збираюся з дорогоцінним каменем Rails Config для тонкого зернистого контролю, який він надає.

Оновлення2

Якщо ви хочете швидкого рішення, то перевірте відповідь Джека Пратта нижче.

Хоча моя початкова відповідь нижче все ще працює, ця відповідь застаріла. Рекомендую переглянути оновлення 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 в моєму додатку.rb. Я припускаю, що app.rb = config / application.rb. Але де в application.rb слід поставити рядок регістра RailsConfig?
Nhím Hổ Báo

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

ОНОВЛЕННЯ рейки 4

У Rails 4 є новий спосіб для цього => http://guides.rubyonrails.org/configuring.html#custom-configuration

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


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

13
Це призначення, але як тоді ви отримуєте доступ до цього значення?
kevzettler

9
Якщо ви подивитесь на application.rb програми rails 3.x, він каже: "Конфігурація програми повинна входити у файли в config / ініціалізаторах" відповідно до цієї відповіді. Існує багато документації про доступ до змінної ( edgeguides.rubyonrails.org/configuring.html ). наприклад, у файлі під назвою some_variables.rb у папці ініціалізаторів розмістіть змінну, як описано вище (замінивши MyApp іменем вашого додатка), тоді, коли ви хочете використовувати його, просто зателефонуйте config.custom_config_variable Ви, звичайно, можете використовувати будь-яке ім'я змінної, яке вам подобається . @Jack Pratt, ви могли б відредагувати більш повну відповідь?
jamesc

48
Чувак, простий: Шлях: config/environments/production.rb Налаштування: config.whatever = false Доступ до нього будь-де: Rails.configuration.whatever
Victor S

5
Будьте обережні, якщо ви встановите щось лише у виробництві та спробуєте отримати доступ до нього в іншому середовищі, воно скаржиться undefined method.
lulalala

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.
lulalala

Я спробував це в рейках 4.1, і я отримую помилки, "... method_missing': undefined method store" для # <Rails :: Application :: Configuration: 0x007f9f735b7240> ... ". Я намагався додати змінну config "config.store.works".
Spundun

1
@Spundun Ви отримуєте цю помилку, тому що Rails не знає, що storeтаке. Щоб використовувати метод у цій відповіді, ви можете або перейменувати змінну store_works, або створити config.storeблок із worksвизначеними в ній.
Пол Петтенгілл

Дякую, я врешті-решт зрозумів це. Що це вкладені хеші, тому мені доведеться ініціалізувати порожні хеші рекурсивно, якщо я буду використовувати точки у своїх іменах конфігурацій.
Spundun

31

Це працює в рейках 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!
siegy22

30

У рейках 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: Yettings

Він працює аналогічно коду у відповіді khelll, але вам потрібно лише додати цей файл конфігурації YAML:

app/config/yetting.yml

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

Yetting.your_setting

Крім того, якщо ви хочете використовувати декілька файлів налаштувань з унікальними іменами, ви можете розмістити їх у підкаталозі всередині програми / конфігурації, як це:

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

Тоді ви можете отримати доступ до таких значень:

FirstYetting.your_setting
SecondYetting.your_setting

Він також надає вам налаштування за замовчуванням, які можна змінити для середовища. Ви також можете використовувати erb всередині файлу yml.


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

4

Мені дуже подобається налаштований самоцвіт. Дуже простий у налаштуванні та використанні.

https://github.com/binarylogic/settingslogic


2
Любити це поки що. Якщо поставити об’єкт налаштувань у додаток / моделі / settings.rb, ви також перезавантажитесь у режимі розробки. Виграй!
Мат Шаффер

4

Якщо ви використовуєте Heroku чи інакше мають необхідність збереження в налаштуваннях програми , як змінні оточення, то Figaro камінь дуже корисно.


2

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


2
Я хочу використовувати додаткові плагіни і т. Д., Оскільки я вивчаю рейки, тому найкращим способом це було б без плагінів.
Шив

Зауважте, для цього використовується база даних для зберігання конфігурацій, які можуть бути занадто важкими для деяких людей.
lulalala

0

Щось ми починаємо робити на роботі - це упорядкований хеш ActiveSupport

Це дозволяє чітко визначити вашу конфігурацію у файлах середовища, наприклад

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

-5

Я б запропонував хороший підхід, як взагалі боротися з конфігурацією у вашій програмі. Є три основні правила:

  • змінити конфігурацію не на код;
  • використовувати конфігурації за умовами;
  • написати код, який щось означає.

Щоб отримати детальніший огляд, перейдіть за цим посиланням: Налаштування рейки належним чином

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.