我有以下代码在我的Rails应用程序中发送ActionCable广播:
ActionCable.server.broadcast 'notification_channel', notification: 'Test message'
连接如下:
module ApplicationCable
class Connection < ActionCable::Connection::Base
identified_by :current_user
def connect
self.current_user = find_verified_user
end
def session
cookies.encrypted[Rails.application.config.session_options[:key]]
end
protected
def find_verified_user
User.find_by(id: session['user_id'])
end
end
end
但是,登录该应用的所有用户都会收到该用户。 identified_by
仅确保登录用户可以连接到频道,但不限制哪些用户获得广播。
有没有办法只向某个用户发送广播?
我能想到的唯一方法就是:
ActionCable.server.broadcast 'notification_channel', notification: 'Test message' if current_user = User.find_by(id: 1)
1
是我想要定位的用户的ID。
答案 0 :(得分:8)
对于特定于用户的通知,我发现拥有一个基于当前用户的订阅的UserChannel很有用:
class UserChannel < ApplicationCable::Channel
def subscribed
stream_for current_user
end
end
这样ActionCable为每个用户创建一个单独的通道,您可以根据用户对象使用这样的命令:
user = User.find(params[:id])
UserChannel.broadcast_to(user, { notification: 'Test message' })
这种方式可以处理所有特定于用户的广播。