Предварителни изисквания:
- Ruby 2.0.0+
- Rails 4.0.0+
- Redis
- Пума
Инициализатор:
Създайте redis.rb
инициализатор файл в config/initializers
директория, глобализирайки екземпляр на redis
. Също така е добра идея да настроите heartbeat
нишка (Всичко от 5 секунди до 5 минути е добре, в зависимост от вашите изисквания):
$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
Контролер:
Трябва да добавите два метода към вашия ChatController
, pub
и sub
. Ролята на pub
е да публикува чат събития и съобщения в redis
и sub
да се абонирате за тези събития. Трябва да изглежда така:
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
Във вашите routes
, направикръчма a POST
ипод a GET
и съпоставете пътя с нещо като /chat/publish
и /chat/subscribe
.
Coffeescript / Javascript:
Ако приемем, че действителната ви уеб страница за приложението за чат е в /chat
, трябва да напишете някакъв Javascript за действително изпращане и получаване на чат съобщения.
За по-лесно разбиране, нека предположим, че вашата уеб страница има само текстово поле и бутон. Натискането на бутона трябва да публикува съдържанието на текстовото поле в потока за чат, можем да направим това с 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
Сега трябва да можете да се абонирате и да получавате съобщенията в чата. Трябва да използвате EventSource
за това. Използване на EventSource , отворете канал за SSE, за да можете да получавате събития и да използвате тези данни, за да актуализирате изгледа. В този пример ще ги регистрираме само в конзолата на javascript.
Кодът трябва да изглежда така:
$(document).ready ->
source = new EventSource('/chat/subscribe')
source.addEventListener 'chat_event', (e) ->
console.log(e.data)
Забележка: Поставете и двата кодови блока по-горе във вашия controllername.coffee
файл, за този пример трябва да бъде chat.js.coffee
във вашето app/assets/javascript
директория. Трябва също така да се уверите, че се зарежда в конвейера за активи. require
го във вашия application.js
файл (ако вече не се обаждате на require tree .
).
Активиране на паралелни заявки:
Във вашата среда за разработка ще трябва да активирате паралелни заявки, като добавите тези два реда към вашия config/environments/development.rb
:
config.preload_frameworks = true
config.allow_concurrency = true
Сега стартирайте браузъра си, потърсете /chat
и вижте магията. Когато въведете съобщение и щракнете върху бутона, съобщението ще бъде получено от всички екземпляри на тази уеб страница.
Ето как се прави основно приложение за чат в rails
използвайки ActionController::Live
и Redis
. Окончателният код очевидно би бил много различен в зависимост от вашите изисквания, но това трябва да ви помогне да започнете.
Още някои ресурси, които трябва да проверите:
- Нежно правене на любов – на живо ли е?
- Railscasts - #401 - ActionController::Live
- SitePoint – Мини чат с Rails и SSEs
- Github - mohanraj-ramanujam / поточно предаване на живо
- Thoughtbot – Пример за чат с използване на SSE