我有一个从另一个rake任务调用的rake任务。
在这个rake任务中,我需要询问用户输入一些文本,然后根据答案继续,或者停止继续(包括调用rake任务)。
我该怎么做?
答案 0 :(得分:60)
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
我认为应该有效
答案 1 :(得分:10)
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
答案 2 :(得分:8)
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简化了常见的控制台交互, 有效地替换了puts()和gets()。用户代码可以简单指定 要询问的问题以及有关用户互动的任何细节,请离开 HighLine的其余工作。当HighLine.ask()返回时,你会 得到你要求的答案,即使HighLine不得不多次询问, 验证结果,执行范围检查,转换类型等。
有关详细信息,请read the docs。
答案 3 :(得分:2)
虽然这个问题很老,但对于使用外部gem的简单用户输入,这可能仍然是一个有趣的(也许是鲜为人知的)替代方案:
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