Yêu cầu trước:
- Ruby 2.0.0+
- Đường ray 4.0.0+
- Redis
- Puma
Bộ khởi tạo:
Tạo redis.rb
tệp khởi tạo trong config/initializers
thư mục, toàn cầu hóa một phiên bản của redis
. Bạn cũng nên thiết lập heartbeat
thread (Thời gian từ 5 giây đến 5 phút đều được, tùy theo yêu cầu của bạn):
$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
Bộ điều khiển:
Bạn cần thêm hai phương thức vào ChatController
của mình , pub
và sub
. Vai trò của pub
là xuất bản các sự kiện và tin nhắn trò chuyện lên redis
và sub
để đăng ký các sự kiện này. Nó sẽ trông giống như sau:
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
Trong routes
của bạn , làm cho quán rượu một POST
và phụ a GET
và khớp với đường dẫn đến một cái gì đó như /chat/publish
và /chat/subscribe
.
Coffeescript / Javascript:
Giả sử trang web thực của bạn cho ứng dụng trò chuyện là tại /chat
, bạn cần viết một số Javascript để thực sự gửi và nhận tin nhắn trò chuyện.
Để dễ hiểu, giả sử trang web của bạn chỉ có một hộp văn bản và một nút. Nhấn vào nút sẽ xuất bản nội dung của hộp văn bản lên luồng trò chuyện, chúng tôi có thể làm điều đó bằng cách sử dụng 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
Bây giờ, bạn cũng cần có thể đăng ký và nhận tin nhắn trò chuyện. Bạn cần sử dụng EventSource
cho điều này. Sử dụng EventSource , mở một kênh cho SSE để bạn có thể nhận các sự kiện và sử dụng dữ liệu đó để cập nhật chế độ xem. Trong ví dụ này, chúng tôi sẽ chỉ đăng nhập chúng vào bảng điều khiển javascript.
Mã sẽ trông giống như sau:
$(document).ready ->
source = new EventSource('/chat/subscribe')
source.addEventListener 'chat_event', (e) ->
console.log(e.data)
Lưu ý: Đặt cả hai khối mã ở trên vào controllername.coffee
của bạn , đối với ví dụ này, nó phải là chat.js.coffee
trong app/assets/javascript
của bạn danh mục. Bạn cũng cần đảm bảo rằng nó đang được tải trong đường dẫn nội dung. require
nó trong application.js
của bạn tệp (nếu bạn chưa gọi require tree .
).
Bật yêu cầu song song:
Trong môi trường phát triển của mình, bạn sẽ phải kích hoạt các yêu cầu song song bằng cách thêm hai dòng này vào config/environments/development.rb
của mình :
config.preload_frameworks = true
config.allow_concurrency = true
Bây giờ hãy khởi động trình duyệt của bạn, duyệt tới /chat
và xem điều kỳ diệu. Khi bạn nhập tin nhắn và nhấp vào nút, tất cả các phiên bản của trang web đó sẽ nhận được tin nhắn đó.
Đây là cách bạn tạo một ứng dụng trò chuyện cơ bản trong rails
sử dụng ActionController::Live
và Redis
. Mã cuối cùng rõ ràng sẽ rất khác nhau tùy thuộc vào yêu cầu của bạn nhưng điều này sẽ giúp bạn bắt đầu.
Một số tài nguyên khác mà bạn nên xem:
- Làm tình dịu dàng - Có trực tiếp không?
- Railscast - # 401 - ActionController ::Trực tiếp
- SitePoint - Trò chuyện nhỏ với Rails và SSE
- Github - mohanraj-ramanujam / live-stream
- Thoughtbot - Ví dụ về trò chuyện sử dụng SSE