2016-02-10 19 views
16

Tôi đã tạo một ứng dụng rất đơn giản bằng cách sử dụng Rails 5 beta 1 và ActionCable để hiển thị khi người dùng trực tuyến và cho phép họ gửi tin nhắn cho nhau. Bây giờ, về cơ bản tôi muốn lấy phần phía máy khách của ActionCable, thực hiện nó trong ngữ cảnh của một ứng dụng khác (không chạy trên Rails 5) và kết nối nó với ứng dụng đầu tiên để gửi và nhận dữ liệu (chẳng hạn như trạng thái trực tuyến của người dùng hoặc tin nhắn).Cách sử dụng ActionCable làm API

Để gửi dữ liệu từ ứng dụng thứ hai đó, tôi cho rằng, tôi có thể chỉ cần thực hiện yêu cầu AJAX POST. Câu hỏi là: Làm cách nào để đăng ký từ ứng dụng thứ hai của tôi tới kết nối mở của ứng dụng đầu tiên?

Hoặc thậm chí: Làm cách nào để đăng ký kết nối ActionCable của ứng dụng Rails của tôi từ một ứng dụng khác thông qua API?

tôi đoán là, tôi về cơ bản muốn bao gồm coffeescript này bằng cách nào đó trong ứng dụng thứ hai của tôi:

App.appearance = App.cable.subscriptions.create "AppearanceChannel", 
    connected: -> 
    # Called when the subscription is ready for use on the server 

    disconnected: -> 
    # Called when the subscription has been terminated by the server 

    received: (data) -> 
    # ... 

Trả lời

16

Trong khi giải pháp mwalsher là cực kỳ hữu ích cho tôi, tôi vừa tìm thấy một yêu cầu kéo vào kho Rails với một giải pháp chính thức cho câu hỏi của tôi .

https://github.com/rails/rails/pull/24991

tôi giả định, trong tương lai gần đây sẽ được thêm vào tài liệu chính. Đây là liên kết đến gói npm actioncable chính thức: https://www.npmjs.com/package/actioncable

Bạn có thể sử dụng nó tương tự như giải pháp của mwalsher với bất kỳ ứng dụng JS nào. Chỉ cần cài đặt gói NPM:

npm install actioncable --save 

Ở đây ví dụ JS từ các tài liệu:

ActionCable = require('actioncable') 

var cable = ActionCable.createConsumer('wss://RAILS-API-PATH.com/cable') 

cable.subscriptions.create('AppearanceChannel', { 
    // normal channel code goes here... 
}); 

Edit: Yêu cầu kéo đã được sáp nhập trong một thời gian, bây giờ và mô tả là một phần của chính thức Readme - chưa có trong Hướng dẫn Rails.

+0

Đây là tin tuyệt vời, cảm ơn Jim! – mwalsher

+0

@jim broski xin vui lòng chia sẻ Kho lưu trữ mở của hai ứng dụng sẽ hữu ích cho các nhà phát triển mới đến đường ray và hành động. Ít nhất là chia sẻ một bài đăng trên đó. Nó sẽ hữu ích. –

17

Bạn về cơ bản sẽ cần bao gồm một bản sao hoặc cổng của mã ActionCable JS trong ứng dụng khác của bạn (https://github.com/rails/rails/tree/master/actioncable/app/assets/javascripts).

Cập nhật: Gần đây tôi đã đưa ra một gói NPM gọi actioncable-js mà cung cấp một cổng trực tiếp của Ruby on Rails ActionCable CofeeScript 5 của tiêu chuẩn JS để sử dụng bên ngoài của Rails: https://github.com/mwalsher/actioncable-js

Vì ActionCable chỉ là một lớp trên đầu trang của các WebSockets HTML5, vì vậy bạn cũng có thể sử dụng mã JS WebSockets thô (hoặc bất kỳ thư viện của bên thứ ba nào) để xử lý thông báo.

Giao thức thông báo ActionCable được ghi lại ở đây: https://github.com/NullVoxPopuli/action_cable_client#the-action-cable-protocol. Tôi sẽ dán dưới đây để tiện theo dõi:

  1. Kết nối với URL Action cáp
  2. Sau khi kết nối thành công, gửi đăng ký nhắn

    • Các đăng ký nhắn JSON sẽ trông như thế này: {"command":"subscribe","identifier":"{\"channel\":\"MeshRelayChannel\"}"}
    • Bạn sẽ nhận được một tin nhắn như sau: {"identifier"=>"{\"channel\":\"MeshRelayChannel\"}", "type"=>"confirm_subscription"}
  3. Sau khi đăng ký, bạn có thể gửi tin nhắn.

    • Đảm bảo chuỗi hành động khớp với tên phương thức xử lý dữ liệu trên máy chủ ActionCable của bạn.
    • Thông điệp của bạn JSON sẽ trông như thế này: {"command":"message","identifier":"{\"channel\":\"MeshRelayChannel\"}","data":"{\"to\":\"user1\",\"message\":\"hello from user2\",\"action\":\"chat\"}"}
    • thông điệp nhận nên nhìn về cùng một
  4. Ghi chú:

    • Mỗi tin nhắn gửi đến máy chủ có lệnh và định danh chủ chốt .
    • Giá trị kênh phải khớp với tên của lớp kênh trên máy chủ ActionCable.
    • identifierdata được giải phóng thành công.

Vì vậy, ví dụ (trong ruby)

payload = { 
    command: 'command text', 
    identifier: { channel: 'MeshRelayChannel' }.to_json, 
    data: { to: 'user', message: 'hi', action: 'chat' }.to_json 
}.to_json 
+0

Có. Tôi cũng đang nhìn vào điều đó. Dù vậy, tôi cảm thấy nó không thẳng thắn. Ít nhất là không phải cho tôi. Có một số phần cần phải được điều chỉnh và không thể được sao chép đơn giản. Thật không may, cổng ES6 dường như không hoạt động với phiên bản mới nhất của Rails 5. – sam

+0

Cập nhật câu trả lời của tôi với một liên kết đến một cổng trực tiếp của ActionCable JS: https://github.com/mwalsher/actioncable-js. Hy vọng rằng điều này sẽ giúp! – mwalsher

+0

Thực sự, giải pháp thực sự tốt đẹp. Cám ơn đã đưa này lại với nhau! Điều này cực kỳ hữu ích. Tôi quyết định tự mình đăng câu trả lời vì tôi vừa tìm thấy yêu cầu kéo trên repo Rails với gói NPM chính thức. – sam

Các vấn đề liên quan