rails - create rake task ruby
Haciendo preguntas en tareas de comisiĆ³n (4)
Tengo una tarea de rake que se llama desde otra tarea de rake.
En esta tarea de rake necesito pedirle al usuario que ingrese texto, y luego, dependiendo de la respuesta, continuar o evitar que todo continúe (incluida la tarea de rake).
¿Cómo puedo hacer esto?
Aunque la pregunta es bastante antigua, esta podría ser una alternativa interesante (y quizás poco conocida) para que un usuario pueda utilizar una gema externa:
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
La gema HighLine hace fácil.
Para una simple pregunta de sí o no, puedes usar el agree
:
require "highline/import"
task :agree do
if agree("Shall we continue? ( yes or no )")
puts "Ok, lets go"
else
puts "Exiting"
end
end
Si quieres hacer algo más complejo utiliza 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
Aquí está la descripción de la gema:
Un objeto HighLine es un shell "orientado a líneas de alto nivel" sobre una entrada y una secuencia de salida. HighLine simplifica la interacción de la consola común, reemplazando eficazmente a pone () y obtiene (). El código de usuario simplemente puede especificar la pregunta que se debe hacer y cualquier detalle sobre la interacción del usuario, luego dejar el resto del trabajo a HighLine. Cuando HighLine.ask () regrese, tendrá la respuesta que solicitó, incluso si HighLine tuvo que preguntar muchas veces, validar resultados, realizar una verificación de rango, convertir tipos, etc.
Para más información puedes leer los documentos .
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
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
creo que deberia funcionar