可以安装多条ActionCable电缆吗?

时间:2017-10-17 15:04:43

标签: ruby-on-rails websocket ruby-on-rails-5 actioncable

是否可以在同一个Rails应用程序中安装多个ActionCable 电缆?例如:

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

我知道我可以使用相同的电缆来拥有多个频道,但我需要为我的频道使用不同的身份验证方法。根据我的理解,使用相同的电缆是不可能的。

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

Using ActionCable with multiple identification methods中所述,在同一个Rails应用程序中使用不同身份验证方法的一种方法可以是:

# app/channels/application_cable/connection.rb

module ApplicationCable
  class Connection < ActionCable::Connection::Base
    identified_by :current_user, :uuid

    def connect
      self.uuid = SecureRandom.urlsafe_base64
      if env['warden'].user
        self.current_user = find_verified_user
      end
    end

    protected

    def find_verified_user
      return User.find_by(id: cookies.signed['user.id'])
    end
  end
end

经过身份验证的频道:

class AuthenticatedChannel < ApplicationCable::Channel
  def subscribed
    reject and return if current_user.blank?
    stream_for current_user
  end
  ...

匿名频道:

class AnonymousChannel < ApplicationCable::Channel
  def subscribed
    stream_from "channel_#{self.uuid}"
  end
  ...

答案 1 :(得分:0)

否,这是不可能的,因为您只能在Rails中配置一台服务器。

config/environments/development.rb文件(或其他环境)中,您只有一个action_cable配置点:

  # Mount Action Cable outside main process or domain
  config.action_cable.mount_path = nil
  config.action_cable.url = 'wss://example.com/cable'
  config.action_cable.allowed_request_origins = [ 'http://example.com', /http:\/\/example.*/ ]

在布局文件中,您也只能有一个action_cable_meta_tag

<!DOCTYPE html>
<html>
  <head>
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    ...

    <%= action_cable_meta_tag %>
  </head>
  <body>
    ...
  </body>
</html>

要拥有许多电缆服务器,您将必须像在Hash中那样配置许多电缆服务器:

  # Mount Action Cable outside main process or domain
  config.action_cable = [
    {
       mount_path: nil
       url: 'wss://example.com/cable'
       allowed_request_origins: [ 'http://example.com', /http:\/\/example.*/ ]
    },
    {
       mount_path: nil
       url: 'wss://example.com/cable2'
       allowed_request_origins: [ 'http://example.com', /http:\/\/example.*/ ]
    }
  ]

并能够使用action_cable_meta_tags(注意复数版本)帮助器进行设置。

但是

但是Rails允许您在独立模式下运行服务器,这是我们在我公司所做的。

因此,我们正在使用puma / unicorn运行电缆服务器,然后不使用action_cable_meta_tag标签,而是将URL强制设置为ActionCable.createConsumer

  const cable = ActionCable.createConsumer('wss://cable1.domain.co/cable')
  const channel = cable.subscriptions.create(...)

认识到,您可以在许多主机或端口上运行许多电缆服务器,然后为每个服务器创建许多ActionCable.createConsumer实例。

那样,您就有许多电缆服务器。

我希望这对希望运行许多电缆服务器的人有所帮助。