Accepting user input from the console/command prom

2019-04-04 05:36发布

问题:

I'm writing a custom rake task for Rails, and there is a point the program where it summarises what it's going to do and then asks the user if what it's about to do is correct.

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

However, this code causes the rake to be aborted prematurely;

rake aborted!
No such file or directory - populate

"populate" is the name of the rake task.

I think what's really causing this error in the .gets method.

I don't know how the .gets method explicitly works, but I'm guessing it must automatically send the user input back to the file where the script is written, and for some reason it's getting confused and it thinks the name of the rake task is the name of the file. As populate.rake doesn't exist, I think this is why the error is being thrown.

However, I don't know how I can get around this error. Does rake offer an alternate method to .gets?

回答1:

Rake tasks are stored in the lib/tasks folder of the Rails application. The rake task's file should end with the .rake extension; for example: populate.rake.

Accepting the input is done with STDIN.gets.chomp instead of 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

You can run this rake task with: rake db:populate