Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 如何将STDOUT重定向到sinatra网页_Ruby_Http_Sinatra_Stdout - Fatal编程技术网

Ruby 如何将STDOUT重定向到sinatra网页

Ruby 如何将STDOUT重定向到sinatra网页,ruby,http,sinatra,stdout,Ruby,Http,Sinatra,Stdout,我以前见过有人问这个问题,但我很好奇用sinatra来完成这个问题。认识到这一点,我假设解决方案已经完成了80% 以下是一些类似的问题供参考: 通用重定向标准输出: 使用sinatra流式传输标准输出(不适用于我): 以下是我试图完成的一个示例(为清晰起见,请简化): 您可以使用(从sinatra contribgem),它提供了一个您可以写入的输出对象 以下是文档中的示例: get '/' do stream do |out| out.puts "Hello World!",

我以前见过有人问这个问题,但我很好奇用sinatra来完成这个问题。认识到这一点,我假设解决方案已经完成了80%

以下是一些类似的问题供参考:

通用重定向标准输出:

使用sinatra流式传输标准输出(不适用于我):

以下是我试图完成的一个示例(为清晰起见,请简化):

您可以使用(从
sinatra contrib
gem),它提供了一个您可以写入的输出对象

以下是文档中的示例:

get '/' do
  stream do |out|
    out.puts "Hello World!", "How are you?"
    out.write "Written #{out.pos} bytes so far!\n"
    out.putc(65) unless out.closed?
    out.flush
  end
end

Ruby Sinatra是服务器端,这意味着您不能像这样更新页面而不刷新。要么刷新,要么利用客户端JavaScript或jQuery,这比您想象的要容易。此外,若要将输出定向到网页,您必须将值嵌入到*.erb文件中,然后运行WEBrick服务器或使用主机。您确定这不可能吗?我的印象是,流可以针对特定的路由进行处理,并在流中仍有数据时继续“加载”。没有刷新--这是页面的初始加载。捕获输出并将其作为视图值提供。是否可以实时执行此操作?我想可能是将
$stdout
保存到一个变量并传递到一个视图,但它并没有同时显示
方法。据我所知,由于Ruby Sinatra是服务器端的,所以没有这样的方法来完成您想要完成的事情。如果您希望更新内容,请使用客户端Javascript.Nice。这绝对是正确的方向。但是,我仍然不知道如何输出放入的
方法的输出
out.put
只输出返回内容的方法--
nil
。坏主意是
$stdout=out
,这会将所有
put
输出重定向到您的响应。我真正的建议是简单地将
传递给
方法,然后在那里使用它。这很有意义。这是我的困惑——这不需要我自己创建方法来传递args吗?我用的是我没有的宝石。例如,我正在尝试将Sinatra服务器日志嵌入到页面中。如果您正在管道化日志,那么窃取
$stderr
可能并不完全疯狂。我会尝试跟踪您的文件直到流式响应,或者您可以使用操作可以使用的共享I/O对象。
foo = StringIO.new
$stdout = foo

get '/' do
  stream do |out|
    method_that_puts
    out.puts $stdout.string
  end
end

def method_that_puts
  puts 'I would like...'
  sleep 1.0
  puts 'to display this...'
  sleep 1.0
  puts 'on a web page!'
end
get '/' do
  stream do |out|
    out.puts "Hello World!", "How are you?"
    out.write "Written #{out.pos} bytes so far!\n"
    out.putc(65) unless out.closed?
    out.flush
  end
end