在rake任务中接受来自控制台/命令提示符的用户输入

Sta*_*ers 15 ruby rake ruby-on-rails

我正在为Rails编写一个自定义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
Run Code Online (Sandbox Code Playgroud)

但是,此代码会导致rake过早中止;

rake aborted!
No such file or directory - populate
Run Code Online (Sandbox Code Playgroud)

" populate "是rake任务的名称.

我认为在.gets方法中导致此错误的原因是什么.

我不知道.gets方法是如何显式工作的,但我猜它必须自动将用户输入发送回写入脚本的文件,并且由于某种原因它变得混乱并且它认为是rake的名称task是文件的名称.由于populate.rake不存在,我认为这就是抛出错误的原因.

但是,我不知道如何解决这个错误.rake是否为.gets提供了另一种方法?

Raj*_*Das 24

Rake任务存储在lib/tasksRails应用程序的文件夹中.rake任务的文件应以.rake扩展名结尾; 例如:populate.rake.

接受输入是用STDIN.gets.chomp而不是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
Run Code Online (Sandbox Code Playgroud)

您可以使用以下命令运行此rake任务: rake db:populate