Задавать вопросы в граблях - PullRequest
38 голосов
/ 07 марта 2011

У меня есть рейк-задача, которая вызывается из другой рейк-задачи.

В этой задаче о граблях мне нужно попросить пользователя ввести какой-нибудь текст, а затем, в зависимости от ответа, либо продолжить, либо прекратить продолжение всего (включая вызывающую задачу рейка).

Как я могу это сделать?

Ответы [ 4 ]

60 голосов
/ 07 марта 2011
task :input_test do
  input = ''
  STDOUT.puts "What is the airspeed velocity of a swallow?"
  input = STDIN.gets.chomp
  raise "bah, humbug!" unless input == "an african or european swallow?"
end
task :blah_blah => :input_test do 
end

я думаю, что должно работать

10 голосов
/ 07 марта 2011
task :ask_question do
  puts "Do you want to go through with the task(Y/N)?"
  get_input
end

task :continue do
  puts "Task starting..."
  # the task is executed here
end

def get_input
  STDOUT.flush
  input = STDIN.gets.chomp
  case input.upcase
  when "Y"
    puts "going through with the task.."
    Rake::Task['continue'].invoke
  when "N"
    puts "aborting the task.."
  else
    puts "Please enter Y or N"
    get_input
  end
end 
8 голосов
/ 19 июня 2013

Камень HighLine делает это легко.

Для простого вопроса «да» или «нет» вы можете использовать agree:

require "highline/import"
task :agree do
  if agree("Shall we continue? ( yes or no )")
    puts "Ok, lets go"
  else
    puts "Exiting"
  end
end

Если вы хотите сделать что-то более сложное, используйте ask:

require "highline/import"
task :ask do
  answer = ask("Go left or right?") { |q|
    q.default   = "left"
    q.validate  = /^(left|right)$/i
  }
  if answer.match(/^right$/i)
    puts "Going to the right"
  else
    puts "Going to the left"
  end
end

Вот описание камня:

Объект HighLine представляет собой «высокоуровневую ориентированную на линию» оболочку над входом и выходной поток. HighLine упрощает взаимодействие с общей консолью, эффективно заменяя put () и gets (). Код пользователя можно просто указать вопрос, чтобы задать и любые детали о взаимодействии с пользователем, а затем оставить остальная часть работы до HighLine. Когда HighLine.ask () вернется, вы получить ответ, который вы просили, даже если HighLine пришлось спрашивать много раз, проверить результаты, выполнить проверку диапазона, преобразовать типы и т. д.

Для получения дополнительной информации вы можете прочитать документы .

2 голосов
/ 01 февраля 2015

Хотя вопрос довольно старый, он все еще может быть интересной (и, возможно, малоизвестной) альтернативой для простого пользовательского ввода с использованием внешнего гема:

require 'rubygems/user_interaction'
include Gem::UserInteraction

task :input_test do
  input = ask("What is the airspeed velocity of a swallow?")
  raise "bah, humbug!" unless input == "an african or european swallow?"
end
task :blah_blah => :input_test do 
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...