Где лучше всего хранить глобалы в приложении Rails?
Мне было интересно, есть ли лучшая практика хранения глобальных настроек в приложении rails. Я имею в виду: i.e: у меня определено несколько глобальных переменных, которые могут измениться, но вряд ли, и кажется неуместным хранить их в БД, так как они используются так много. Например, у меня есть SYSTEM_EMAIL и SYSTEM_EMAIL_SIGNATURE и SYSTEM_STORAGE_ROOT.
Сейчас я храню их в среде environment.rb, но я не уверен, что это правильный палец для их хранения.
Спасибо
EDIT:
Принятый ответ по-прежнему подходит, но я с тех пор перешел к использованию https://github.com/markbates/configatron, есть другие варианты, но мне нравится configatron больше всего.
Ответы
Ответ 1
Один из моих любимых методов - поместить файл, содержащий константы в каталог config/initializers/
(все файлы в этом каталоге загружаются автоматически), но с разделом для каждой среды Rails. например.
case ENV['RAILS_ENV']
when "development"
SYSTEM_EMAIL = ...
SYSTEM_EMAIL_SIGNATURE = ...
when "staging"
SYSTEM_EMAIL = ...
SYSTEM_EMAIL_SIGNATURE = ...
when "production"
SYSTEM_EMAIL = ...
SYSTEM_EMAIL_SIGNATURE = ...
end
Если вы хотите вместо этого загрузить все константы в один большой хэш, вы можете загрузить их как файл YAML. Создайте два файла, один из которых называется, скажем, config/initializers/email_constants.rb
, а другой config/email_constants.yml
. В последнем случае что-то вроде:
development:
:system_email: ...
:system_email_signature: ...
staging:
:system_email: ...
system_email_signature: ...
... etc ...
Затем в config/initializers/email_constants.rb
поместите:
EMAIL_CONSTANTS = YAML.load_file("#{RAILS_ROOT}/config/email_constants.yml")[RAILS_ENV]
Загружает весь файл YAML и присваивает значение соответствующего ключа (который представляет RAILS_ENV
) на EMAIL_CONSTANTS
.
Преимущество обоих этих методов - это локальность. Вы можете поместить все константы, которые связаны друг с другом (то есть константы электронной почты в этом случае) в один файл. Кроме того, вместо того, чтобы одни и те же константы были распределены по трем различным файлам (по одному для каждой среды Rails), вы все в одном файле.
Ответ 2
Поскольку такие значения часто меняются в зависимости от среды, в которой вы работаете, я храню глобальные значения в config/environments/development.rb|production.rb|test.rb
с соответствующими значениями для каждой среды.
Ответ 3
Rails 3 вводит объект Application. Даже с Rails 2 вы можете захотеть сохранить свои глобальные переменные аналогичным образом.
Ответ 4
environment.rb - это место. Вы можете добавить его в модуль и добавить его в каталог lib. то вы можете назвать его как Module:: MY_GLOBAL_VARIABLE. Оба имеют сильные стороны и слабые места. В environment.rb нормально, но иногда это выглядит грязно. Если все эти глобальные переменные связаны, вы можете группировать их в модуле.
Ответ 5
Я храню такую конфигурационную информацию в файле YML. Подробнее см. screen-cast.
В качестве альтернативы вы можете использовать драгоценный камень, называемый app_config.
Ответ 6
Обычно, когда я делаю что-то подобное, у меня есть два способа сделать это
1 - Если мои глобальные переменные являются общими для всех трех сред (разработка, тестирование, производство), то я сохраню его в
config/environment.rb файл
Но скажем, мои значения изменяются в среде
Пример: моя среда разработки SYSTEM_STORAGE_ROOT - это '/development_root/' и тестовая среда SYSTEM_STORAGE_ROOT is '/testing_root/'
тогда я буду хранить их внутри
конфигурации/среда/
В соответствии с приведенным выше примером
config/environment/development.rb будет иметь
SYSTEM_STORAGE_ROOT = '/development_root/'
config/environment/test.rb будет иметь
SYSTEM_STORAGE_ROOT = '/testing_root/'
config/environment/production.rb будет иметь
SYSTEM_STORAGE_ROOT = '/production_root/'
надеюсь, что это поможет,
веселит,
Sameera