将txt文件的内容实时流式传输到rails视图

时间:2013-03-27 17:23:44

标签: ruby file-io

将文件内容流式传输到网页的最简单方法是什么,因为它会更新。

我目前有一个.txt文件在脚本运行时不断更新,我希望在用户更新时在页面上显示该文件。

是否有一个简单的宝石或技术可以实现这一目标?还是有一种优秀的纯Ruby方法?

我的第一个想法是使用某种AJAX请求来返回文件的差异,但我觉得这将是一个糟糕的方法。

2 个答案:

答案 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。

在您的应用或脚本中,您可以发布到服务器,将新数据推送到所有订阅的频道。