Ruby 如何将STDOUT重定向到sinatra网页
我以前见过有人问这个问题,但我很好奇用sinatra来完成这个问题。认识到这一点,我假设解决方案已经完成了80% 以下是一些类似的问题供参考: 通用重定向标准输出: 使用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 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