Глобальные переменные в Rails

При разработке возникает вопрос хранения глобальных переменных:

  • токены для сторонних сервисов
  • почта куда будут приходить уведомления
  • url сайта для майлеров
  • ключ для шифрования cookies

И всё в том же духе.

Есть две причины вытащить все эти вещи в отдельный файл — удобство редактирования настрок и удобство исключения всего одного файла из репозитория (из соображений безопасности).

config.yml #

Создайте .yml файл:

vim config/config.yml

Его содержимое может быть примерно таким:

defaults: &defaults
  mailer:
    from: "notifications@domain.tld"
    to:   "ksevelyar@domain.tld"

development: &non_production_settings
  <<: *defaults
  secret_key_base: "rake secret"
  domain: localhost:2000
  title: Domain [dev]

test:
  <<: *defaults
  <<: *non_production_settings

production:
  <<: *defaults
  secret_key_base: "rake secret"
  domain: domain.tld
  title: Domain
  google_analytics: UA-00000000-0

SETTINGS #

Загружаем файл в хеш SETTINGS:

vim config/environment.rb
# Load the Rails application.
require File.expand_path('../application', __FILE__)

# Settings
RAW_SETTINGS = File.read(Rails.root + "config/config.yml")
SETTINGS = YAML.load(RAW_SETTINGS)[Rails.env]

# Initialize the Rails application.
Dobroserver::Application.initialize!

Уже можно пользоваться:

rails runner 'p SETTINGS["domain"]'
"localhost:3000"

Осталось заменить настройки там, где это требуется, например:

vim config/initializers/secret_token.rb
Dobroserver::Application.config.secret_key_base = SETTINGS["secret_key_base"]

Deploy #

Файл с настройками лучше не добавлять в репозиторий вообще. Как и database.yml его лучше переименовать в шаблон:

cp config/config.yml{,.example}
echo "config/config.yml" >> .gitignore
git rm config/config.yml

Для Capistrano указание на линковку этого файла будет выглядеть так:

set :linked_files, %w{config/database.yml config/config.yml}

Добавить комментарий