将ActionCable发送给特定用户

时间:2017-05-12 15:09:06

标签: ruby-on-rails

我有以下代码在我的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。

1 个答案:

答案 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' })

这种方式可以处理所有特定于用户的广播。