如何在使用Action Cable时使状态保持一致

时间:2016-05-10 19:44:26

标签: ruby-on-rails multithreading actioncable

假设我们使用类似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

1 个答案:

答案 0 :(得分: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