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