前置条件:
- Ruby 2.0.0+
- Rails 4.0.0+
- Redis
- Puma
初始化器:
在config/initializers
目录中创建一个redis.rb
初始化文件,将redis
实例全局化。另外建议设置一个heartbeat
线程(根据您的需求,从5秒到5分钟都可以):
$redis = Redis.new
heartbeat_thread = Thread.new do
while true
$redis.publish("heartbeat","thump")
sleep 15.seconds
end
end
at_exit do
heartbeat_thread.kill
$redis.quit
end
控制器:
您需要向您的ChatController
添加两个方法:pub
和sub
。 pub
的作用是将聊天事件和消息发布到redis
,而sub
则订阅这些事件。应该看起来像这样:
class ChatController < ApplicationController
include ActionController::Live
skip_before_filter :verify_authenticity_token
def index
end
def pub
$redis.publish 'chat_event', params[:chat_data].to_json
render json: {}, status: 200
end
def sub
response.headers["Content-Type"] = "text/event-stream"
redis = Redis.new
redis.subscribe(['chat_event', 'heartbeat']) do |on|
on.message do |event, data|
response.stream.write "event: #{event}\ndata: #{data}\n\n"
end
end
rescue IOError
logger.info "Stream Closed"
ensure
redis.quit
response.stream.close
end
end
在你的路由
中,将pub设为POST
,将sub设为GET
,并将路径匹配为像/chat/publish
和/chat/subscribe
这样的东西。
Coffeescript / Javascript:
假设你的聊天应用程序的实际网页位于/chat
,你需要编写一些Javascript来发送和接收聊天消息。
为了方便理解,我们假设你的网页只有一个文本框和一个按钮。点击按钮应该将文本框的内容发布到聊天流中,我们可以使用AJAX来完成:
$('button#send').click (e) ->
e.preventDefault()
$.ajax '/chat/publish',
type: 'POST'
data:
chat_data: {
message: $("input#message").val()
timestamp: $.now()
error: (jqXHR, textStatus, errorThrown) ->
console.log "Failed: " + textStatus
success: (data, textStatus, jqXHR) ->
console.log "Success: " + textStatus
现在,你需要能够订阅并接收聊天消息。你需要使用EventSource
来实现。使用EventSource开启SSE通道,以便可以接收事件,并使用该数据来更新视图。在这个例子中,我们只会将它们记录到Javascript控制台。
代码应该类似于:
$(document).ready ->
source = new EventSource('/chat/subscribe')
source.addEventListener 'chat_event', (e) ->
console.log(e.data)
注意: 把上述两段代码块放入你的controllername.coffee
文件中,对于这个示例,请把它放在你的app/assets/javascript
目录下的chat.js.coffee
文件中。你还需要确保它被加载到了资产管道中,并在你的application.js
文件中require
它(如果你还没有调用require tree .
)。
启用并行请求:
在你的开发环境中,你需要在config/environments/development.rb
文件中添加以下两行以启用并行请求:
config.preload_frameworks = true
config.allow_concurrency = true
现在打开你的浏览器,输入/chat
并观看这个神奇的应用。当你输入一条消息并点击发送按钮时,该消息将被所有对应的网页实例接收。
以上就是使用ActionController::Live
和Redis
在rails
中创建一个基本聊天应用的方法。根据你的需求,最终代码可能会有所不同,但这应该可以帮助你入门。
以下还有一些你应该查看的资源:
resque
?resque
在其中的作用是什么? - Sheharyarusers/show
,我有ChatBoxController
来使用redis并在users/show
页面上更新..你有什么想法吗? - Rahul Dess