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