Где лучшее место для хранения глобалов в приложении Rails? - PullRequest
12 голосов
/ 20 апреля 2010

Мне было интересно, есть ли лучший способ хранения глобальных настроек в приложении rails. Под этим я подразумеваю то есть: у меня есть несколько определенных глобальных переменных, которые могут измениться, но маловероятно, и кажется неуместным хранить их в БД, поскольку они используются очень часто. Например, у меня есть SYSTEM_EMAIL & SYSTEM_EMAIL_SIGNATURE & SYSTEM_STORAGE_ROOT.

Сейчас я храню их в environment.rb, но я не уверен, что это правильное место для их хранения.

Спасибо

EDIT:

Принятый ответ по-прежнему остается подходящим, однако с тех пор я перешел к использованию https://github.com/markbates/configatron, есть и другие варианты, но мне больше всего нравится configatron.

Ответы [ 6 ]

15 голосов
/ 20 апреля 2010

Один из моих любимых методов - поместить файл, содержащий константы, в каталог 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), у вас есть все они в одном файле.

10 голосов
/ 20 апреля 2010

Поскольку такие значения часто меняются в зависимости от среды, в которой вы работаете, я храню глобальные значения в config/environments/development.rb|production.rb|test.rb с соответствующими значениями для каждой среды.

2 голосов
/ 20 апреля 2010

Rails 3 представляет объект Application. Даже с Rails 2 вы можете хранить ваши глобальные переменные аналогичным образом.

1 голос
/ 20 апреля 2010

Обычно, когда я делаю что-то подобное, у меня есть два способа сделать это

1 - Если мои глобальные переменные являются общими для всех трех сред (разработка, тестирование, производство), я сохраню их в

config / environment.rb file

Но допустим, что мои ценности меняются в окружающей среде

Пример: моя среда разработки SYSTEM_STORAGE_ROOT - '/ development_root /', а среда тестирования SYSTEM_STORAGE_ROOT - '/ testing_root /'

тогда я буду хранить их внутри

конфигурации / среда / * * 1013

Согласно приведенному выше примеру

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 /'

надеюсь, это поможет,

веселит, Самира

1 голос
/ 20 апреля 2010

Я храню такую ​​информацию о конфигурации в файле YML. Обратитесь к этому скринингу для получения более подробной информации.

В качестве альтернативы вы можете использовать гем под названием app_config .

1 голос
/ 20 апреля 2010

environment.rb это место. Вы можете добавить его в модуль и добавить в каталог lib. тогда вы можете назвать его как Module :: MY_GLOBAL_VARIABLE. У обоих есть сильные и слабые стороны. В environment.rb все в порядке, но иногда это выглядит грязно. Если все эти глобальные переменные связаны, вы можете сгруппировать их в модуле.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...