42 votes

Poser des questions dans les tâches rake

J'ai une tâche rake qui est appelée par une autre tâche rake.

Dans cette tâche rake, je dois demander à l'utilisateur de saisir du texte, puis, en fonction de la réponse, soit continuer, soit tout arrêter (y compris la tâche rake appelante).

Comment puis-je le faire ?

63voto

loosecannon Points 3666
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

Je pense que ça devrait marcher

1 votes

S'il vous plaît, utilisez STDIN.gets.chomp, pour tronquer le caractère de la nouvelle ligne pour une correspondance exacte de la chaîne

1 votes

@kaiser , il suffit de décider ce qu'il faut faire avec une structure de contrôle de type if/then/else ou unless ou même case. Dans ce cas, je lève une exception (pour arrêter l'exécution comme dans la question de l'OP) mais vous pouvez faire n'importe quoi avec l'entrée, il suffit de modifier la question pour être clair que vous voulez un oui ou un non, l'une des autres réponses le fait je pense.

0 votes

Merci. Je suis déjà un cours sur Ruby sur CodCademy. Je suis juste trop PHP pour elsif y unless ... :P

12voto

rubyprince Points 7665
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

9voto

maartencls Points 1474

El HighLine gem rend cela facile.

Pour une question simple de type oui ou non, vous pouvez utiliser 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 vous voulez faire quelque chose de plus complexe, utilisez 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

Voici la description de la pierre précieuse :

Un objet HighLine est un shell "orienté ligne de haut niveau" sur un flux d'entrée et de sortie. et un flux de sortie. HighLine simplifie les interactions courantes avec la console, remplaçant efficacement puts() et gets(). Le code utilisateur peut simplement spécifier la question à poser et tous les détails concernant l'interaction avec l'utilisateur, puis laisser le reste du travail à HighLine. Lorsque HighLine.ask() revient, vous aurez la réponse que vous avez demandée, même si HighLine a dû la demander plusieurs fois, valider les résultats, vérifier les plages, convertir les types, etc.

Pour plus d'informations, vous pouvez lire les documents .

0 votes

Merci d'avoir posté ce message, highline a également résolu mon problème. INCROYABLE !

0 votes

Une idée de quand ce code affichera "^M" lorsque la touche entrée est pressée après avoir tapé "non" ?

5voto

zor-el Points 151

Bien que la question soit assez ancienne, il pourrait s'agir d'une alternative intéressante (et peut-être peu connue) pour un simple guidage sans bijou externe :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X