Простой способ сделать это - создать плагин Rails, который принимает аргументы, используя «gets» в своем «init.rb». Позвольте мне быстро приготовить пример кода:
Создайте каталог: '$ railsRoot / vendor / plugins / startup_args / lib'
Создать объект для хранения данных аргумента в '$ railsRoot / vendor / plugins / startup_args / lib / startup_args.rb':
module StartupArgs
@@argHash = {}
def self.setArg(key, value)
@@argHash[key.to_sym] = value
end
def self.getArg(key)
return @@argHash[key.to_sym]
end
end
Загрузите модуль StartupArgs в пространство имен проекта Rails и заполните его аргументами в '$ railsRoot / vendor / plugins / startup_args / init.rb':
require "startup_args"
promptString = "Enter arg name (type nothing to continue):"
puts promptString
while (newArg = gets.chomp) != ""
puts "Enter value for '#{newArg}':"
newVal = gets.chomp
StartupArgs.setArg(newArg, newVal)
puts promptString
end
Теперь во время запуска проекта Rails он будет пытаться получить пары ключ-значение из консоли. Эти пары будут сохранены в объекте глобального пространства имен StartupArgs для последующего доступа (через 'StartupArgs.getArg ()').
Если вы ожидаете, что ваш Rails-проект может быть развернут в сценариях, когда демон не будет иметь доступа к консоли во время запуска, вы можете читать из именованного канала вместо стандартного ввода консоли.
Если пойти еще дальше, вы можете удалить все части файла init.rb, кроме оператора require, и добавить действие, выполняющее эту настройку, в контроллер, который будет принимать соответствующие параметры в виде публикации через Интернет. Обязательно сконфигурируйте Rails, чтобы предотвратить ввод потенциально чувствительных параметров (например, паролей) в доступ к файлам журналов при регистрации или ошибках (особенно, если он может использоваться как HTTP GET с параметрами в URL).
(Вы получаете тот же эффект, что и в описанной выше системе, если вы настраиваете другие действия Rails на игнорирование запросов до тех пор, пока действие установки не сохранит соответствующие параметры для глобального объекта.)
Примечание для Мики: у меня нет репутации, чтобы комментировать непосредственно ваше сообщение, поэтому я включу свой комментарий здесь. Может быть несколько причин рассмотреть систему, которая никогда не требует, чтобы пароль был представлен в файловой системе. Например, разработчик может планировать проект Rails, который может быть развернут в различных операционных системах и в различных средах. Если разработчик решает, что могут быть сценарии, в которых администратор или пользователь root может быть скомпрометирован, ему нельзя доверять или его нельзя попросить подписать соглашения о конфиденциальности и безопасности, разработчик может решить добавить дополнительную маскировку размещения пароля в памяти только (в интересах требования немного менее безопасной системы или чуть более умной атаки для кражи пароля). Возможно, это можно рассматривать как вопрос относительных затрат: при низких затратах пароль может быть скрыт таким образом, что для его извлечения требуются более дорогие знания.