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