2013-09-30 6 views
14

Sto scrivendo un compito rake personalizzato per Rails, e c'è un punto nel programma in cui riassume ciò che sta per fare e poi chiede all'utente se è quello che è che sta per fare è correttoAccettazione dell'input dell'utente dalla console/prompt dei comandi all'interno di un'attività rake

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 

Tuttavia, questo codice causa l'interruzione anticipata del rastrello;

rake aborted! 
No such file or directory - populate 

"Populate" è il nome dell'attività rake.

Penso che cosa stia realmente causando questo errore nel metodo .gets.

Non so come i .gets metodo funziona in modo esplicito, ma credo che deve inviare automaticamente l'input dell'utente al file in cui viene scritto il copione, e per qualche motivo è che confondersi e pensa che il nome dell'attività rake sia il nome del file. Come populate.rake non esiste, penso che questo sia il motivo per cui viene generato l'errore.

Tuttavia, non so come risolvere questo errore. Il rastrello offre un metodo alternativo a .gets?

+0

http://stackoverflow.com/questions/5427839/is-it-possible-to-make-an-interactive-rake-task – tihom

risposta

21

Le attività di rastrellamento vengono archiviate nella cartella lib/tasks dell'applicazione Rails. Il file dell'attività rake deve terminare con l'estensione .rake; ad esempio: populate.rake.

L'accettazione dell'input viene eseguita con STDIN.gets.chomp anziché 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 

È possibile eseguire questa operazione con rake: rake db:populate

+0

Sì , termina con .rake (non .rb, scusa, digitazione automatica: P) ed è in lib/tasks – Starkers

+0

Sì, il mio script è esattamente come quello – Starkers

+0

oko allora quale errore ricevi –

Problemi correlati