###前提・実現したいこと
Rails5でActionCableを使った登録制チャットアプリケーションを作成しています。
ユーザーがオンラインになった時にsubscribedからUserモデルのstatusカラムを1(オンライン)にし、
オフラインになったらunsubscribedから0(オフライン)にしてオンラインステータスを管理しているのですが、
ユーザーが同じ画面を複数タブ開いている場合、ひとつでもタブを閉じるとunsubscribedが呼ばれて、statusが0になってしまいます。
そこで、自分自身のユーザー名のstatusが0で配信された場合に、クライアントからupdate_statusを呼んで、statusを1に戻す機能を書いていたのですが、# ココ
で示したbroadcast_appearance
ではstatus: 0
が配信されてしまいます。
###該当のソースコード
ruby
1class AppearanceChannel < ApplicationCable::Channel 2 def subscribed 3 stream_from 'hoge' 4 current_user.update_attribute(:status, 1) 5 broadcast_appearance 6 end 7 8 def unsubscribed 9 current_user.update_attribute(:status, 0) 10 broadcast_appearance 11 end 12 13 def update_status 14 current_user.update_attribute(:status, 1) 15 broadcast_appearance # ココ 16 end 17 18 private 19 20 def broadcast_appearance 21 ActionCable.server.broadcast( 22 'hoge', 23 users: User.where(workspace_id: current_user.workspace_id).select('name', 'status').as_json 24 ) 25 end 26end
###試したこと
コンソールからUser.all
や# ココ
周辺でp User.all
p current_user
などをしてみるとstatus: 1
となっているので、モデル自体は更新されているものの、配信部分でどこかのキャッシュが呼ばれているような気がします。
ターミナルをみると User Load (0.2ms) SELECT "users"."name", "users"."status" ~~
となっているので、activerecordのキャッシュが問題ではないと思います。
また、複数タブ対策として書いている部分なので、もっとスマートに複数タブで開かれた時の解決策があれば教えてください
あなたの回答
tips
プレビュー