是否可以在同一个Rails应用程序中安装多个ActionCable 电缆?例如:
#routes.rb
Rails.application.routes.draw do
...
mount ActionCable.server => '/cable'
mount ActionCable.server => '/cable2'
end
我知道我可以使用相同的电缆来拥有多个频道,但我需要为我的频道使用不同的身份验证方法。根据我的理解,使用相同的电缆是不可能的。
感谢您的帮助。
答案 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
实例。
那样,您就有许多电缆服务器。
我希望这对希望运行许多电缆服务器的人有所帮助。