1

私だけがアクセスする単純な Rails (3.2.11) デモを作成しています。私は次のものを持っています:

1) Food という名前の Rails 足場

2) 新しい Food を作成するカスタム ルート/コントローラーを呼び出すことができる Android デバイス。( Food.create...)。

そこで、私のコンピューターのブラウザーでhttp://myapp.com、Rails アプリをホストしている をロードします。render であるため、すぐにすべての食品をロードしますfoods#index。ただし、Androidデバイスから呼び出して新しいものを作成した瞬間Food、データベースが新しい食品があることを認識しているにもかかわらず、ブラウザーページ(コンピューター上の)にはまだ食品の古いリストが表示されています. (この時点ではまだページを更新していないため)

Foodテーブルのデータベースが変更されたときに、「リスナー/オブザーバー」を追加してページを自動的に更新するにはどうすればよいですか? これは可能ですか?

<meta http-equiv="refresh" content="5">30 分間のデモ全体でコンピューターのブラウザーをオンのままにしたいので、探していません。

=================

また、3年以上Railsを使っていないので、よろしければ初心者にもわかるように説明していただけませんか?(明確な詳細が望ましい)

4

3 に答える 3

1

以前は、 Juggernautを使用してサーバーからクライアントにデータをプッシュするのが一般的なオプションでした。Websocket が広く使用される前から使用されていましたが、HTML5 Server-Sent-Events (SSE) を支持して最近廃止されました。SSE を使用するには、次のようにクライアント側リスナーを適用します。

var source = new EventSource('/stream');
source.addEventListener('message', function(e) {
  console.log('Received a message:', e.data);

  //fetch new data with AJAX, or reload
  location.reload();
});

サーバー側では、イベントを送信する方法がたくさんあります。Crampを使用して、イベントの送信は次のように行われます (ドキュメントから取得):

class TimeAction < Cramp::Action
  self.transport = :sse
  #set the transport to Server-Sent Event

  on_start :send_latest_time
  periodic_timer :send_latest_time, :every => 2

  def send_latest_time
    data = {'time' => Time.now.to_i}.to_json
    render data
  end
end

Sinatra を使用している場合、コードは次のようになります。

get '/stream', :provides => 'text/event-stream' do
  stream :keep_open do |out|
    connections << out
    out.callback { connections.delete(out) }
  end
end

サーバー送信イベントは、Internet Explorer と Opera Mini を除くほとんどすべてのブラウザーでサポートされていますが、こちらまたはこちら(jQuery ソリューション) のようなフォールバック/ポリフィル ライブラリがいくつかあります。Websocket とは異なり、HTTP プロトコルを引き続き使用しますが、Websocket は多方向通信に使用できるのに対し、それらは一方向であることに注意してください。SSE と websockets の違いに興味がある場合は、こちらを参照してください。

于 2013-08-28T19:14:03.273 に答える
1

Fayeを見てみることをお勧めします。それについては、正確にセットアップする方法について詳しく説明している優れたRailscastがあります。

于 2013-08-19T06:43:58.750 に答える