【问题标题】:How to make state consistency while using Action Cable如何在使用 Action Cable 时使状态保持一致
【发布时间】:2016-05-10 19:44:26
【问题描述】:

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

【问题讨论】:

    标签: ruby-on-rails multithreading actioncable


    【解决方案1】:

    您要做的是向 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-03-10
      • 1970-01-01
      • 2018-07-29
      • 1970-01-01
      • 2017-07-10
      • 2018-08-27
      • 2011-09-05
      相关资源
      最近更新 更多