2016-10-23 2 views
4

Я запускаю приложение rails 5 в качестве серверного сервера и приложение ember для внешнего приложения. Они два отдельных приложений, размещенных на двух разных доменах - скажем, backend.dev и frontend.devПодключение ActionCable к другому хосту

Применение Рельсы имеет простой класс соединений найдено в app/channels/application_cable/connection.rb, который выглядит следующим образом:

module ApplicationCable 
    class Connection < ActionCable::Connection::Base 
    def connect 
     Rails.logger.debug("env: #{env.inspect}") 
     Rails.logger.info("cookies.signed: #{cookies.signed.inspect}") 
    end 
    end 
end 

У меня есть простой базовый канал класс по app/channels/application_cable/channel.rb со следующими:

module ApplicationCable 
    class Channel < ActionCable::Channel::Base 
    end 
end 

И одной реализации этого класса в app/channels/events_channel.rb:

class EventsChannel < ApplicationCable::Channel 
    def subscribed 
    Rails.logger.debug("env: #{env.inspect}") 
    Rails.logger.info("cookies.signed: #{cookies.signed.inspect}") 
    stream_from 'events' 
    end 
end 

С другой стороны, я пользуюсь пакетом ember-cable. Я настройка моего потребителя в моем внешнем интерфейсе, расширяя класс контроллера со следующим:

cableService: Ember.inject.service('cable'), 

setupConsumer: Ember.on('init', function() { 
    let service = this.get('cableService'); 
    let consumer = service.createConsumer(`ws://backend.dev`); 
    let channel = 'EventsChannel'; 

    consumer.subscriptions.create(channel, { 
    disconnected() { 
     Ember.debug(`${channel}#disconnected`); 
    }, 

    connected() { 
     Ember.debug(`${channel}#connected`); 
    }, 

Я совершенно уверен, что мой потребитель настроен правильно, так как я вижу некоторый вывод отладки, когда я получаю следующий вывод на мою Js консоль:

DEBUG: EventsChannel#disconnected 

Однако, я также вижу странную ошибку в консоли, а также:

WebSocket connection to 'ws://backend.dev/' failed: Error during WebSocket handshake: Unexpected response code: 200 

Я не s что делать с ошибкой кода ответа здесь, и абсолютно ничего не регистрируется в моем приложении rails. Есть ли что-то еще, что мне нужно для настройки работы с действиями по доменам? Любая идея о том, что здесь означает код ответа 200?

+0

Что в вашей конфигурации/routes.rb? Где вы устанавливаете ActionCable ('/ cable'?) Возможно, вам просто нужно добавить точку монтирования в ваш вызов' service.createConsumer' - вы ищете что-то вроде «mount ActionCable.server => '/ cable' 'в routes.rb – Undo

+0

Вы забыли включить' contentSecurityPolicy' в 'config/environment.js' для атрибута 'connect-src', как этот' 'connect-src ':' 'self' ws: //backend.dev/ backend.dev", ' – kumkanillam

+0

thanks @Undo и @kumkanillam - я монтирую ActionCable сервер с помощью 'mount ActionCable.server => '/ cable'' - запросы на« backend.dev »возвращают ошибку« неожиданного ответа 200 », тогда как запросы на« backend.dev/cable »просто производят 404s. У меня также есть конфигурация конфигурации 'connect-src' аналогично вышеприведенному комментарию. – matt

ответ

3

Попробуйте это:

# routes.rb 
Rails.application.routes.draw do 
    # your code 
    mount ActionCable.server => '/cable' 
end 

Тогда в вашем приложении:

let consumer = service.createConsumer(`ws://backend.dev/cable`); 

Если вы столкнулись с рукопожатия проблемы, есть несколько решений:

  1. проверить, если ваш Приложение frontend совместимо с protocol 07 или новее.

  2. Проверьте, если ваш сайт находится в config.action_cable.allowed_request_origins

  3. Добавить config.web_socket_server_url = 'ws://backend.dev/cable' в файл cofig ENV.

  4. Вы можете использовать быстрый «грязный» взлом. Просто добавьте следующие строки в ваш файл cofig ENV:

    config.action_cable.disable_request_forgery_protection = true 
    
Смежные вопросы