Io 在使用capistrano在远程服务器上运行ruby代码时,如何请求用户输入?

Io 在使用capistrano在远程服务器上运行ruby代码时,如何请求用户输入?,io,capistrano,capistrano3,Io,Capistrano,Capistrano3,我想确认在远程服务器上运行capistrano任务时的操作: task :do_someting do on roles(:primary) do within release_path do with rails_env: fetch(:rails_env) do execute :rails, :runner, %Q['require "do_something"; Do::Something.()'] end

我想确认在远程服务器上运行capistrano任务时的操作:

task :do_someting do
  on roles(:primary) do
    within release_path do
      with rails_env: fetch(:rails_env) do
        execute :rails, :runner,
          %Q['require "do_something"; Do::Something.()']
      end
    end
  end
end
其中DoSomethig看起来像这样:

require "highline/import"

class DoSomething

  def self.call
    query_db_for_objects.each do |obj|
      answer = ask "Are you sure to do something with #{obj}? (y/n)"
      rerun unless answer == 'y'
      do_something
    end
  end

end
当从远程服务器发出请求时,来自highline gem的方法
ask
似乎不起作用,命令
bundle exec cap production do_something
将永远挂起


运行此capistrano任务时,如何从远程服务器请求用户输入?

我能够使用以下ruby代码从远程服务器读取用户答案

task :do_someting do

  class ConfirmHandler
    def on_data(command, stream_name, data, channel)
      if data.to_s =~ /\?$/
        prompt = Net::SSH::Prompt.default.start(type: 'confirm')
        response = prompt.ask "Please enter your response (y/n)"
        channel.send_data "#{response}\n"
      end
    end
  end

  on roles(:primary) do
    within release_path do
      with rails_env: fetch(:rails_env) do
        execute :rails, :runner,
          %Q['require "do_something"; Do::Something.()']
      end
    end
  end

end
其中
Do::Something
具有
ask\u user
方法,该方法如下所示:

class Do::Something

  def self.call
    answer = ask_user
    puts "Answer is: #{answer}"
  end

  def self.ask_user
    puts 'Do something?'
    `read response; echo $response`
  end

end