ファイルのコンテンツが更新されたときに、ファイルの内容を Web ページにストリーミングする最も簡単な方法は何でしょうか。
現在.txt
、スクリプトの実行中に常に更新されるファイルがあり、更新時にユーザーのページに表示したいと考えています。
これを達成するための単純な宝石や技術はありますか? または、優れた純粋な Ruby のアプローチはありますか?
私が最初に考えたのは、ある種の AJAX リクエストを使用してファイルの差分を返すことでしたが、それは悪いアプローチだと思います。
これを実現するために、Tony Arcieri の Celluloid's Reelを使用しました。
これをバックグラウンドで実行します (この部分については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 サーバーにポスト リクエストを送信するコマンド ライン スクリプトを作成しました。Jesse Storimer によるパイプラインを尊重する Ruby スクリプトの記述から多くの助けがありました。
~/bin/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
私の Web アプリには、Web ソケットに接続して出力をページに表示する JavaScript (この場合は CoffeeScript) があります。
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;
}
Faye や gem private_pub (Faye チャネルを非公開にする) のようなものを使用して調べることができます。これにより、Web ソケットまたはロング ポーリングを利用して新しいデータをクライアントにプッシュできます。Github ページと RailsCast には多くのドキュメントがあります。
アプリまたはスクリプトでは、新しいデータをすべてのサブスクライブ チャネルにプッシュするサーバーに公開できます。