Принятие пользовательского ввода из командной строки в командной строке

Я пишу настраиваемую задачу rake для Rails, и есть точка, в которой она суммирует, что она собирается делать, а затем спрашивает пользователя, правильно ли это делать.

puts "\n Is this what you want to happen? [Y/N]"
answer = gets.chomp

if answer == "Y"
    # commits
else if answer == "N"
    return false #(Aborts the rake task)
end

Однако этот код вызывает преждевременное прерывание грабли,

rake aborted!
No such file or directory - populate

" populate" - это имя задачи рейка.

Я думаю, что действительно вызывает эту ошибку в методе .gets.

Я не знаю, как явно работает метод .gets, но я предполагаю, что он должен автоматически отправить пользовательский ввод обратно в файл, где написано script, а для некоторых причина, по которой он запутывается, и думает, что имя команды rake - это имя файла. Поскольку populate.rake не существует, я думаю, именно поэтому возникает ошибка.

Однако я не знаю, как обойти эту ошибку. Использует ли rake альтернативный метод .gets?

Ответы

Ответ 1

Задачи Rake хранятся в папке lib/tasks приложения Rails. Файл задачи рейка должен заканчиваться расширением .rake; например: populate.rake.

Принятие ввода выполняется с помощью STDIN.gets.chomp вместо gets.chomp.

namespace :db do
  desc "Prints the migrated versions"
  task :populate => :environment do
    puts "\n Is this what you want to happen? [Y/N]"
    answer = STDIN.gets.chomp
    puts answer
    if answer == "Y"
      # your code here
    elsif answer == "N"
      return false # Abort the rake task
    end
  end
end

Вы можете запустить эту задачу рейка с помощью: rake db:populate