Forudgående krav:
- Ruby 2.0.0+
- Rails 4.0.0+
- Redis
- Puma
Initializer:
Opret en redis.rb
initializer-fil i config/initializers
bibliotek, som globaliserer en forekomst af redis
. Det er også en god idé at konfigurere et heartbeat
tråd (Alt fra 5 sekunder til 5 minutter er okay, afhængigt af dine krav):
$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
Controller:
Du skal tilføje to metoder til din ChatController
, pub
og sub
. Rollen som pub
er at udgive chatbegivenheder og beskeder til redis
og sub
at abonnere på disse begivenheder. Det skulle se sådan ud:
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
I dine routes
, lav pub en POST
og sub en GET
, og match stien til noget som /chat/publish
og /chat/subscribe
.
Coffeescript / Javascript:
Forudsat at din faktiske webside for chat-appen er på /chat
, skal du skrive noget Javascript til rent faktisk at sende og modtage chatbeskeder.
For at lette forståelsen, lad os antage, at din webside kun har en tekstboks og en knap. Hvis du trykker på knappen, skal indholdet af tekstboksen offentliggøres til chatstrømmen, det kan vi gøre ved at bruge 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
Nu skal du også kunne abonnere og modtage chatbeskeder. Du skal bruge EventSource
for det. Brug af EventSource , åbn en kanal for SSE, så du kan modtage begivenheder, og brug disse data til at opdatere visningen. I dette eksempel vil vi kun logge dem til javascript-konsollen.
Koden skulle se nogenlunde sådan ud:
$(document).ready ->
source = new EventSource('/chat/subscribe')
source.addEventListener 'chat_event', (e) ->
console.log(e.data)
Bemærk: Placer begge kodeblokke ovenfor i din controllername.coffee
fil, for dette eksempel skal det være chat.js.coffee
i din app/assets/javascript
vejviser. Du skal også sørge for, at den bliver indlæst i aktivpipelinen. require
det i din application.js
fil (hvis du ikke allerede kalder require tree .
).
Aktiver parallelle anmodninger:
I dit udviklingsmiljø bliver du nødt til at aktivere parallelle anmodninger ved at tilføje disse to linjer til din config/environments/development.rb
:
config.preload_frameworks = true
config.allow_concurrency = true
Tænd nu din browser, gå til /chat
og se magien. Når du skriver en besked og klikker på knappen, vil beskeden blive modtaget af alle forekomster af den pågældende webside.
Nå, det er sådan, du laver en grundlæggende chatapplikation i rails
ved hjælp af ActionController::Live
og Redis
. Den endelige kode ville naturligvis være meget anderledes afhængigt af dine krav, men dette burde få dig i gang.
Nogle flere ressourcer, du bør tjekke ud:
- Tender Love Making - Er det live?
- Railscasts - #401 - ActionController::Live
- SitePoint - Minichat med skinner og SSE'er
- Github - mohanraj-ramanujam / live-stream
- Thoughtbot - Chateksempel ved hjælp af SSE'er