rails 3: есть ли способ поместить параметры конфигурации гема в environment.rb вместо foo.yml? - PullRequest
3 голосов
/ 03 июня 2011

В моем приложении rails используется гем, для которого необходимо указать некоторые параметры конфигурации в foo.yml:

development:
  username: MyDevUserName
  password: MyDevPassword
production:
  username: MyPRODUserName
  password: MyPRODPassword

Я не хочу пароль в исходном коде и хочу сделать что-то вроде:

development:
  username: <%= ENV['THE_USERNAME'] %>
  password: <%= ENV['THE_PASSWORD'] %>
production:
  username: <%= ENV['THE_USERNAME'] %>
  password: <%= ENV['THE_PASSWORD'] %>

Однако по какой-то причине <% = ENV ['XXX']%> работает в моем файле Settings.yml, но не работает в моем файле foo.yml (я предполагаю, что foogem загружает файл .yml, который не допускает интерпретацию).

Итак ...

Интересно, есть ли в Ruby / Rails универсальный способ задания переменных в среде.rb вместо файла foo.yml?

Могу ли я, например, иметь пустой файл foo.yml и добавить следующее в environment.rb :

Foo::_something_._somethingelse =
{
  :username => ENV['THE_USERNAME'],
  :password => ENV['THE_PASSWORD']
}

1 Ответ

3 голосов
/ 07 июня 2011

РЕДАКТИРОВАТЬ: Поскольку вы находитесь на Heroku ...

Heroku это другая история.Использование ENV может противоречить некоторым функциям, встроенным в Heroku для обработки конфигурационных переменных, например тех, с которыми вы работаете.Вам нужно (барабанная дробь, пожалуйста) ... КОНФИГ. ВАРЫ .См. на этой странице в Heroku Dev Center для получения информации о том, как установить конфигурационные переменные в вашем развертывании Heroku, как получить к ним доступ из вашего приложения и как заставить все это работать локально.

РЕДАКТИРОВАТЬ: Ниже приведен оригинальный ответ, все еще применимый в общем (не геройском) случае

Даже если вы поместите его в environment.rb, он все равно будет в вашем источникеcode.

Правильный способ сделать это - игнорировать файл foo.yml в вашем контроле версий (например, в git вы бы добавили этот файл в файл .gitignore).Таким образом, у вас есть файл локально там, где он вам нужен, но он никогда не фиксируется в вашем хранилище, поэтому ваши кредиты не раскрываются.На вашем сервере развертывания вам также придется вручную создавать этот файл, поскольку при развертывании из исходного кода развертывание не будет иметь его.

Если вы используете capistrano для развертывания, общий подход будетчтобы поместить файл в [app] /shared/config/foo.yml, затем добавьте задачу развертывания в softlink из [sharedpath] в [releasepath].Такая задача в Капистрано может выглядеть так:

task :after_update_code do
  run "ln -s #{shared_path}/config/foo.yml #{release_path}/config/foo.yml"
end
...