2

假设我们使用类似 current_user 的东西,它是一个 ServiceClass 的实例,它包含用户模型、会话参数和其他信息。问题是该变量在与 websocket 连接期间被设置,并被重用于不同订阅上的所有 AC 调用。

然后,在某个时候用户决定更新他的用户名,我们调用 current_user.update(new_username) 并且它工作正常。

但该用户下的其他 AC 订阅仍使用旧用户模型。我想由于每个订阅都在自己的线程下工作,因此在一个线程下更新用户模型不会在其他线程下更新它们。这种情况的最佳方法是什么?

class ServiceClass

def initialize(session,...)
  @session = session
  @user = current_user
end

 def update!(username)
  @user.username = username
  @user.save!
 end

 ...
end

module ApplicationCable
    class Channel < ActionCable::Channel::Base
      def current_user
        @current_user ||= ServiceClass.new(session, user)
      end
    end
end
4

1 回答 1

0

您要做的是向 current_user 广播并让 current_user 订阅他/她的流。

在您的控制器中:

ActionCable.server.broadcast "#{current_user}"

在您的频道中(例如 app/channels/user_channel.rb)

class UserChannel < ApplicationCable::Channel  
  def subscribed
    stream_from "#{current_user}"
  end
end
于 2016-12-07T23:40:49.480 回答