将文件内容流式传输到网页的最简单方法是什么,因为它会更新。
我目前有一个.txt
文件在脚本运行时不断更新,我希望在用户更新时在页面上显示该文件。
是否有一个简单的宝石或技术可以实现这一目标?还是有一种优秀的纯Ruby方法?
我的第一个想法是使用某种AJAX请求来返回文件的差异,但我觉得这将是一个糟糕的方法。
答案 0 :(得分:2)
我使用Celluloid's Reel by Tony Arcieri来完成此任务。
我在后台运行此功能(在此部分获得了Adam Dalton的大量帮助):
<强> my_reel.rb 强>
require 'reel'
CONNECTIONS = []
Reel::Server.supervise("0.0.0.0", 5000) do |connection|
while request = connection.request
case request
when Reel::Request
puts "Client requested: #{request.method} #{request.url} #{request.body}"
CONNECTIONS.each do |c|
c << request.body
end
request.respond :ok, 'YES! YOU GOT IT!'
when Reel::WebSocket
puts "Client made a WebSocket request to: #{request.url}"
CONNECTIONS << request
break
end
end
end
sleep
然后我编写了一个命令行脚本来将帖子请求发送到Reel服务器。得到了Writing Ruby Scripts That Respect Pipelines by Jesse Storimer的很多帮助。
<强>〜/斌/ serve_it_up 强>
#!/usr/bin/env ruby
require 'httparty'
ARGF.each_line do |line|
output_line = line.chop
HTTParty.post 'http://localhost:5000', body: output_line
end
然后为了使其工作,我的Rails应用程序使用Sidekiq(bundle exec sidekiq
),并在单击按钮时在后台运行脚本,该按钮将输出发送到文件output.txt
。所以我运行一个强制尾部并将它的输出传递给我的命令行脚本。
tail -f output.txt | serve_it_up
在我的网络应用程序中,我有一些JavaScript(在这种情况下为CoffeeScript),它连接到Web套接字并将输出放在页面上:
connection = new WebSocket('ws://localhost:5000')
connection.onmessage = (event) ->
$('#prompt').append(event.data + '<br/>')
prompt = document.getElementById('prompt')
prompt.scrollTop = prompt.scrollHeight
因此,只要output.txt发生变化,它就会从tail -f
获取输出并将其放入Web浏览器中。我还将#prompt
div的样式设置为有限的高度,并且我始终将其保持在底部。
以下是它的风格:
#prompt {
font-family: Consolas, Menlo, Monaco, Lucida Console, Liberation Mono, DejaVu Sans Mono, Bitstream Vera Sans Mono, Courier New, monospace, serif;
height: 200px;
overflow: auto;
}
答案 1 :(得分:0)
您可以考虑使用像Faye或gem private_pub这样的东西(它使Faye频道成为私有),它允许您使用Web套接字或长轮询将新数据推送到客户端。 Github页面上有很多文档,还有一个RailsCast。
在您的应用或脚本中,您可以发布到服务器,将新数据推送到所有订阅的频道。