2

LayerVault の善良な人々は、クライアント側の MCV に頼ったり、Node.js でアプリ全体を書き直したりすることなく、既存の Ruby アプリケーションに「リアルタイム」機能を追加する簡単な方法を投稿しました。彼らの投稿は、レールモデルが更新されるたびにすべてのクライアントに更新できることを示しています[参照 1] delay_job & Active:Record Observer:

  class FileObserver < ActiveRecord::Observer
      observer :lv_file

    def after_commit(record)
      record.delay.report_updated
    end
  end

  class LVFile < ActiveRecord::Base
     def report_updated
        Messenger.publish_message('file_updated', "file/#{self.id}")
     end
  end

【参考1】http://layervault.tumblr.com/post/31462727280/rails-in-realtime-part-2

クライアント側の JavaScript から socket.io サーバーに接続するのは簡単です。Messenger.publish_message('file_updated', "file/#{self.id}")ただし、Railsサーバー側で実装する方法がわかりません。投稿で、彼らはそれについて言及しました

report_updated メソッドは、別の Messenger クラス(Web アプリ側の Socket.IO インターフェイス) へのクラス メソッド呼び出しを行い、ファイルが適切なルームに変更されたことを報告します。

Messagerしかし、Active:Record Observer が自分の socket.io サーバーに接続して更新を送信できるように、Rails にクラスを実装する方法はまだよくわかりません。

[PS] HN での会話は、彼らがこの宝石を利用したことを示しています

gem の wiki には簡単なデモも含まれていました。

 require 'SocketIO'

   client = SocketIO.connect("http://localhost", sync: true) do
      before_start do
        on_message {|message| puts message}
        on_disconnect {puts "I GOT A DISCONNECT"}
      end

      after_start do
        emit("loadLogs", "/var/www/rails_app/log/production.log")
      end
   end

    puts "socket still running"
   loop do
     sleep 10
     puts 'zzz'
   end
4

1 に答える 1

0

Messenger クラスにはあまり意味がありません。必要なのは、接続を作成し、メッセージを送信してから、まとめることだけです。これは私たちの全体ですmessenger.rb:

require 'socketio-client'

class Messenger
  def self.send_message!(name, args)
    begin
      SocketIO.connect(MESSENGER_SOCKETIO_ADDRESS, sync: true) do
        after_start do
          emit(name, args)
          disconnect
        end
      end
    rescue
    end
  end
end
于 2013-02-17T18:55:09.027 に答える