Předběžné požadavky:
- Ruby 2.0.0+
- Rails 4.0.0+
- Redis
- Puma
Inicializátor:
Vytvořte redis.rb
inicializační soubor v config/initializers
adresář, globalizující instanci redis
. Je také dobré nastavit heartbeat
vlákno (Cokoli od 5 sekund do 5 minut je v pořádku, v závislosti na vašich požadavcích):
$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
Ovladač:
Do ChatController
musíte přidat dvě metody , pub
a sub
. Role pub
je publikovat chatové události a zprávy na redis
a sub
k odběru těchto akcí. Mělo by to vypadat nějak takto:
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
Ve vašich routes
, udělat hospodu POST
a sub GET
a cestu přiřaďte k něčemu jako /chat/publish
a /chat/subscribe
.
Coffeescript / Javascript:
Za předpokladu, že vaše skutečná webová stránka chatovací aplikace je na /chat
, musíte napsat nějaký Javascript skutečně odesílat a přijímat chatové zprávy.
Pro snazší pochopení předpokládejme, že vaše webová stránka má pouze textové pole a tlačítko. Stisknutím tlačítka byste měli publikovat obsah textového pole do streamu chatu, můžeme to udělat pomocí 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
Nyní musíte mít možnost přihlásit se k odběru a také přijímat chatové zprávy. Musíte použít EventSource
pro tohle. Pomocí EventSource otevřete kanál pro SSE, abyste mohli přijímat události, a použijte tato data k aktualizaci zobrazení. V tomto příkladu je přihlásíme pouze do konzole javascriptu.
Kód by měl vypadat nějak takto:
$(document).ready ->
source = new EventSource('/chat/subscribe')
source.addEventListener 'chat_event', (e) ->
console.log(e.data)
Poznámka: Umístěte oba výše uvedené bloky kódu do controllername.coffee
soubor, v tomto příkladu by to mělo být chat.js.coffee
ve vaší app/assets/javascript
adresář. Musíte se také ujistit, že se načítá do potrubí aktiv. require
ve vašem application.js
soubor (pokud již nevoláte require tree .
).
Povolit paralelní požadavky:
Ve svém vývojovém prostředí budete muset povolit paralelní požadavky přidáním těchto dvou řádků do config/environments/development.rb
:
config.preload_frameworks = true
config.allow_concurrency = true
Nyní spusťte prohlížeč, přejděte na /chat
a uvidíte kouzlo. Když napíšete zprávu a kliknete na tlačítko, zpráva bude přijata všemi instancemi dané webové stránky.
Takhle vytvoříte základní chatovací aplikaci v rails
pomocí ActionController::Live
a Redis
. Konečný kód by se samozřejmě velmi lišil v závislosti na vašich požadavcích, ale toto by vám mělo pomoci začít.
Některé další zdroje, které byste si měli prohlédnout:
- Něžné milování – je to živé?
- Railscasts – #401 – ActionController::Live
- SitePoint – Mini Chat s Rails a SSE
- Github – mohanraj-ramanujam / živé vysílání
- Thoughtbot – příklad chatu pomocí SSE