開發瑞信通的時候偶然看到了ActionController::Live,可以做類似即時通訊的東西,不過不支持webrick,只支持puma和unicorn~,具體使用如下:
<pre>class MyController < ActionController::Base
# 步驟 1
include ActionController::Live
def stream
# 步驟 2
response.headers['Content-Type'] = 'text/event-stream'
100.times {
# 步驟 3 直接使用 response.stream
response.stream.write "hello world\n"
sleep 1
}
ensure
# 步驟 4
response.stream.close
end
end
</pre>
可以直接在頁面直接訪問 /my/stream即可
不過更合適通過ajax去訪問,因為HTML5有一個服務器推送事件(Server-sent Events)
http://www.ibm.com/developerworks/cn/web/1307_chengfu_serversentevent/
通過ajax訪問如下:
<pre>
jQuery(document).ready(function(){
var source = new EventSource("/my/stream");
source.addEventListener('update', function(e){
$("#target_div").append(e)
// update a div, reload a section of the page
});
// you can add different event listeners to
// process some logic based on the event push
// from the server to do something unique based
// users leaving, joining the application or other
// kinds of events not releated to users.
});
</pre>
下面有個ActionController::Live +redis+resque的簡單實時聊天實現,有興趣的同學可以去看看
http://stackoverflow.com/questions/29150274/how-to-use-actioncontrollerlive-along-with-resque-redis-for-chat-applicatio