Wymagania wstępne:
- Rubin 2.0.0+
- Szyny 4.0.0+
- Ponownie
- Puma
Inicjator:
Utwórz plik redis.rb
plik inicjujący w config/initializers
katalog, globalizując instancję redis
. Dobrym pomysłem jest również ustawienie heartbeat
wątek (Wszystko od 5 sekund do 5 minut jest w porządku, w zależności od Twoich wymagań):
$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
Kontroler:
Musisz dodać dwie metody do swojego ChatController
, pub
i sub
. Rola pub
jest publikowanie wydarzeń i wiadomości czatu w redis
i sub
aby zapisać się na te wydarzenia. Powinno to wyglądać mniej więcej tak:
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
W Twoich routes
, utwórz publikację POST
i sub GET
i dopasuj ścieżkę do czegoś takiego jak /chat/publish
i /chat/subscribe
.
Skrypt kawowy / Javascript:
Zakładając, że Twoja rzeczywista strona internetowa aplikacji czatu znajduje się pod adresem /chat
, musisz napisać jakiś Javascript aby faktycznie wysyłać i odbierać wiadomości na czacie.
Dla ułatwienia załóżmy, że Twoja strona internetowa ma tylko pole tekstowe i przycisk. Naciśnięcie przycisku powinno opublikować zawartość pola tekstowego w strumieniu czatu, możemy to zrobić za 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
Teraz musisz mieć możliwość subskrybowania i odbierania wiadomości na czacie. Musisz użyć EventSource
dla tego. Korzystanie z Źródła zdarzeń , otwórz kanał dla SSE, aby móc odbierać zdarzenia i używać tych danych do aktualizowania widoku. W tym przykładzie zarejestrujemy je tylko w konsoli javascript.
Kod powinien wyglądać mniej więcej tak:
$(document).ready ->
source = new EventSource('/chat/subscribe')
source.addEventListener 'chat_event', (e) ->
console.log(e.data)
Uwaga: Umieść oba powyższe bloki kodu w swoim controllername.coffee
plik, w tym przykładzie powinien to być chat.js.coffee
w Twojej app/assets/javascript
informator. Musisz również upewnić się, że jest ładowany do potoku zasobów. require
w swoim application.js
plik (jeśli jeszcze nie wywołujesz require tree .
).
Włącz żądania równoległe:
W swoim środowisku programistycznym będziesz musiał włączyć żądania równoległe, dodając te dwie linie do swojego config/environments/development.rb
:
config.preload_frameworks = true
config.allow_concurrency = true
Teraz uruchom przeglądarkę, przejdź do /chat
i zobacz magię. Po wpisaniu wiadomości i kliknięciu przycisku wiadomość zostanie odebrana przez wszystkie wystąpienia tej strony internetowej.
Oto jak tworzysz podstawową aplikację do czatu w rails
za pomocą ActionController::Live
i Redis
. Ostateczny kod będzie oczywiście bardzo różny w zależności od Twoich wymagań, ale to powinno Cię zacząć.
Więcej zasobów, które powinieneś sprawdzić:
- Czuła miłość — czy jest na żywo?
- Railscasts — #401 — ActionController::Live
- SitePoint - Miniczat z Railsami i SSE
- Github - mohanraj-ramanujam / transmisja na żywo
- Thinkbot — przykład czatu z użyciem SSE