1

ファイルのコンテンツが更新されたときに、ファイルの内容を Web ページにストリーミングする最も簡単な方法は何でしょうか。

現在.txt、スクリプトの実行中に常に更新されるファイルがあり、更新時にユーザーのページに表示したいと考えています。

これを達成するための単純な宝石や技術はありますか? または、優れた純粋な Ruby のアプローチはありますか?

私が最初に考えたのは、ある種の AJAX リクエストを使用してファイルの差分を返すことでしたが、それは悪いアプローチだと思います。

4

2 に答える 2

2

これを実現するために、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;
}
于 2013-04-05T15:18:03.903 に答える
0

Faye や gem private_pub (Faye チャネルを非公開にする) のようなものを使用して調べることができます。これにより、Web ソケットまたはロング ポーリングを利用して新しいデータをクライアントにプッシュできます。Github ページと RailsCast には多くのドキュメントがあります。

アプリまたはスクリプトでは、新しいデータをすべてのサブスクライブ チャネルにプッシュするサーバーに公開できます。

于 2013-03-27T17:29:28.503 に答える