2011-03-25 15 views
31

मैं एक रेक कार्य चलाने के लिए चाहता हूं जो उपयोगकर्ता को इनपुट के लिए पूछता है।क्या एक इंटरैक्टिव रेक कार्य करना संभव है?

मुझे पता है कि मैं कमांड लाइन पर इनपुट आपूर्ति कर सकते हैं, लेकिन मैं अगर वे कर रहे हैं यकीन वे मामले में एक विशेष कार्य के साथ आगे बढ़ना चाहते वे मानों में से एक रैक कार्य करने के लिए आपूर्ति की गलत टाइप उपयोगकर्ता पूछना चाहता हूँ ।

+6

इंटरैक्टिव कार्यों के लिए [थोर] (https://github.com/wycats/thor) में देखें। यह रेक के लिए काफी बेहतर है, और यह रेल के साथ आता है, इसलिए आपके पास पहले से ही कुछ भी इंस्टॉल किए बिना है। – meagar

+0

@ मीगर बस आज इस में भाग गया और अटक गया, क्या आपने कभी इसे समझ लिया? मैं zsh के साथ एक मैक पर हूँ। । । –

+0

बस इसे समझ लिया - यह स्पष्ट रूप से रेल zsh प्लगइन से संबंधित था। जब मैंने उस प्लगइन को हटा दिया, तो zsh को पुनरारंभ किया, फिर इसे फिर से जोड़ा गया समस्या गायब हो गई। । । –

उत्तर

69

कुछ इस तरह

task :action do 
    STDOUT.puts "I'm acting!" 
end 

task :check do 
    STDOUT.puts "Are you sure? (y/n)" 
    input = STDIN.gets.strip 
    if input == 'y' 
    Rake::Task["action"].reenable 
    Rake::Task["action"].invoke 
    else 
    STDOUT.puts "So sorry for the confusion" 
    end 
end 

टास्क पुनः सक्षम काम करते हैं और से How to run Rake tasks from within Rake tasks?

+0

कोई विचार जब यह कोड "^" दिखाएगा जब "कुंजी" टाइप करने के बाद एंटर कुंजी दबाया जाएगा ?? –

5

उपयोगकर्ता इनपुट के लिए एक सरल विशेषता, एक do..while पाश में यह डाल करने के लिए केवल करने के लिए जब कोई उपयोगकर्ता वैध की आपूर्ति की है जारी रखने के लिए है लागू हो सकता है इनपुट। रुबी में स्पष्ट रूप से यह निर्माण नहीं है, लेकिन आप begin और until के साथ एक ही चीज़ प्राप्त कर सकते हैं। इससे स्वीकृत उत्तर में निम्नानुसार जोड़ा जाएगा:

task :action do 
    STDOUT.puts "I'm acting!" 
end 

task :check do 
    # Loop until the user supplies a valid option 
    begin 
    STDOUT.puts "Are you sure? (y/n)" 
    input = STDIN.gets.strip.downcase 
    end until %w(y n).include?(input) 

    if input == 'y' 
    Rake::Task["action"].reenable 
    Rake::Task["action"].invoke 
    else 
    # We know at this point that they've explicitly said no, 
    # rather than fumble the keyboard 
    STDOUT.puts "So sorry for the confusion" 
    end 
end 
1

यहां एक और कार्य का उपयोग किए बिना एक उदाहरण दिया गया है।

task :solve_earth_problems => :environment do  
    STDOUT.puts "This is risky. Are you sure? (y/n)" 

    begin 
    input = STDIN.gets.strip.downcase 
    end until %w(y n).include?(input) 

    if input != 'y' 
    STDOUT.puts "So sorry for the confusion" 
    return 
    end 

    # user accepted, carry on 
    Humanity.wipe_out! 
end 
संबंधित मुद्दे