Cáp hành động trong đường ray

Tram Ho

Action Cable in Rails

Hôm nay chúng ta sẽ build 1 app chat sử dụng ActionCable websocket, rails và postgreql

Http và Websockets

Với Http việc kết nối giữa client server có vòng đời ngắn. Client request đến server, kết nối được hình thành và dữ liệu được máy chủ trả về cho client gọi là response. Sau đó kết nối được đóng lại. Nhưng làm thế nào để client biết server có thay đổi. Thông thường, http sử dụng long pulling. Client sẽ hỏi server xem có gì thay đổi không trong khoảng thời gian nhất định
Không giống như http, websocket là phương thức cho phép client và server giữ kết nối, client và server có thể trao đổi qua lại. Client subscribes đến channel trên server và khi có thay đổi, server sẽ phát tín hiệu và client nhận nó.

ActionCable hoạt động như thế nào?

Trong Rails, controller được xây dựng với mục đích xử lí các http request. Để xử lí các kết nối websocket, rails đã tạo ra thư mục mới gọi là channels. Channels hoạt động giống controller để xử lí các Websocket request. Các channel có thể được client subscribe để truyền dữ liệu qua lại.

Cài đặt

ActionCable là tín năng mới được tích hợp trên rails 5.
Databse: PostgreSQL

Sau đó cấu hình ở trong file database.yml xong thì chạy

Các bước cần làm:

  • Tạo channel websocket phía server gọi là room_channel, nó sẽ có các các method để xử lí việc subscribe, unsubscribe và gửi data đến client
  • Sử dụng javascript ở client đế gọi subscribe, unsubcribe, xử lí việc gửi mà nhận dữ liệu.

Tiếp theo chúng ta sẽ tạo model mesage

rồi tạo bảng message trong db

List tất cả các message

view rooms#show

Tạo channel

routes.

cable.coffee

Đặt <%= action_cable_meta_tag %> trong head của app/views/layouts/application.html.erb

Tạo channel

subscribed method sẽ được gọi khi client kết nối đến channel, và nó thường được sử dụng để bật lắng nghe những thay đổi cho client. speak method nhận data từ client.

Ở đây, client subscribes đến server thông qua App.room = App.cable.subscriptions.create "RoomChannel". connected và disconnected dùng để xử lí trạng thái kết nối, received xử lí data nhận được từ server. speak method có nhiệm vụ gửi data lên server.

Truyền dữ liệu

Thêm tham số vào speak method

speak sẽ gửi 1 message Json object đến speak method trong class RoomChannel.

Bây giờ, speak method sẽ phát tin nhắn lên room_channel. Nhưng làm thế nào để chúng ta nhận được?
Để làm điều này ta chỉ định tất cả các subscriber nhận nó sử dụng stream_from trong subscribed method.

Về bản chất, room_channel là môi trường trong actioncable server, nơi mà dữ liệu đến và đổ về những client nhất định. Chúng ra có thể nhận dữ liệu từ subscribed method sử dụng received method trong room.coffee

Một event listener được thêm phía dưới file cho textbox ở trong template. Khi chúng ta viết gì đó và nhấn enter, nó sẽ gọi speak method trong room.coffee và gửi text đã nhập lên server.

Xử lí database

Khi nhận data từ client gửi lên, thay vì phát nó lên channel thì bây giờ lưu vào database.

Để giảm thời gian chờ server xử lí request, ta sử dụng background job để phát sóng message lên channel

Hoàn thành

Bây giờ, bạn có thể start server và nhập vào textbox và tin nhắn của mình xuất hiện trong cuộc trò chuyện.

Chia sẻ bài viết ngay

Nguồn bài viết : Viblo