Requisitos previos:
- Rubí 2.0.0+
- Rieles 4.0.0+
- Redis
- Puma
Inicializador:
Crear un redis.rb
archivo de inicialización en config/initializers
directorio, globalizando una instancia de redis
. También es una buena idea configurar un heartbeat
hilo (cualquier cosa entre 5 segundos y 5 minutos está bien, según sus requisitos):
$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
Controlador:
Debe agregar dos métodos a su ChatController
, pub
y sub
. El rol de pub
es publicar eventos de chat y mensajes en redis
y sub
para suscribirse a estos eventos. Debería ser algo como esto:
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
En tus routes
, hacer pub un POST
y suscribir un GET
y haga coincidir la ruta con algo como /chat/publish
y /chat/subscribe
.
Coffescript/Javascript:
Suponiendo que su página web real para la aplicación de chat esté en /chat
, necesitas escribir algo de Javascript para enviar y recibir mensajes de chat.
Para facilitar la comprensión, supongamos que su página web solo tiene un cuadro de texto y un botón. Presionar el botón debería publicar el contenido del cuadro de texto en la transmisión de chat, podemos hacerlo usando 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
Ahora, debe poder suscribirse y recibir los mensajes de chat también. Necesitas usar EventSource
para esto. Uso de Fuente de eventos , abra un canal para SSE para que pueda recibir eventos y use esos datos para actualizar la vista. En este ejemplo, solo los registraremos en la consola de JavaScript.
El código debería verse así:
$(document).ready ->
source = new EventSource('/chat/subscribe')
source.addEventListener 'chat_event', (e) ->
console.log(e.data)
Nota: Coloque los dos bloques de código de arriba en su controllername.coffee
archivo, para este ejemplo debería ser chat.js.coffee
en tu app/assets/javascript
directorio. También debe asegurarse de que se esté cargando en la canalización de activos. require
en tu application.js
archivo (si aún no está llamando a require tree .
).
Habilitar solicitudes paralelas:
En su entorno de desarrollo, deberá habilitar las solicitudes paralelas agregando estas dos líneas a su config/environments/development.rb
:
config.preload_frameworks = true
config.allow_concurrency = true
Ahora abra su navegador, vaya a /chat
y ver la magia. Cuando escribe un mensaje y hace clic en el botón, el mensaje será recibido por todas las instancias de esa página web.
Bueno, así es como se hace una aplicación de chat básica en rails
usando ActionController::Live
y Redis
. El código final obviamente sería muy diferente según sus requisitos, pero esto debería ayudarlo a comenzar.
Algunos recursos más que debería consultar:
- Tender Love Making - ¿Es en vivo?
- Railscasts - #401 - ActionController::Live
- SitePoint - Mini Chat con Rails y SSE
- Github - mohanraj-ramanujam / transmisión en vivo
- Thoughtbot:ejemplo de chat con SSE