如何在ActionCable订阅回调中将初始有效负载传输到客户端?

时间:2016-08-29 02:44:37

标签: ruby-on-rails ruby websocket actioncable

我有Ruby on Rails应用程序,它使用ActionCable进行实时客户端通信。我有ScoreChannel负责流式传输用户分数更新:

class ScoreChannel < ApplicationCable::Channel
  def self.broadcast_name(user:)
    "score_#{user.guid}"
  end

  def broadcast_name
    self.class.broadcast_name(user: current_user)
  end

  def subscribed
    stream_from(broadcast_name)
    ActionCable.server.broadcast(broadcast_name, Cable::V1::ScoreSerializer.new(current_user).as_json)
  end
end

我正在尝试在用户订阅频道后立即发送用户的当前分数(请参阅ScoreChannel#subscribed方法)。不幸的是,由于ActionCable的异步性质,得分广播在用户订阅ScoreChannel之前进行。因此,用户不会收到初始分数有效负载(因为他尚未订阅此频道)。这是redis监视器时间轴:

1472430005.884742 [1 172.18.0.6:50242] "subscribe" "action_cable/Z2lkOi8vYXBwLWVuZ2luZS9Vc2VyLzE"
1472430010.988077 [1 172.18.0.6:50244] "publish" "score_cc112e3fdfb5411a965a31f9468abf98" "{\"score\":17,\"rank\":1}"
1472430010.988773 [1 172.18.0.6:50242] "subscribe" "score_cc112e3fdfb5411a965a31f9468abf98"

解决这个问题的最佳方法是什么?

1 个答案:

答案 0 :(得分:0)

不要使用ActionCable.server.broadcast向现有订阅者广播,而是尝试使用transmit - 方法,如下所示:

transmit(Cable::V1::ScoreSerializer.new(current_user).as_json)

这只会将状态发送给正在处理的当前订阅者,但我认为这是您想要的。