2016-06-07 3 views
0

나는 사용자가 온라인 상태인지 여부에 크게 의존하는 코드가 있습니다.ActionCable을 사용하여 사용자를 "온라인"으로 유지

현재 I는 다음과 같이 설정 ActionCable을했습니다 :

class DriverRequestsChannel < ApplicationCable::Channel 
    def subscribed 
     stream_from "requests_#{current_user.id}" 
    end 

    def unsubscribed 
    current_user.unavailable! if current_user.available? 
    end 
end 

이제 제가 이상적으로 다루 좋아할 것은 단지 대신 오프라인의 사용자가 그들의 브라우저를 닫을 경우입니다. 그러나 구독 취소 문제는 페이지 새로 고침에 관한 것입니다. 따라서 페이지를 새로 고침 할 때마다 unsubscribed이 실행됩니다. 따라서 이용 가능하다고 판단 되더라도 사용할 수 없게됩니다.

이제 중요한 것은 사용할 수있는 것이 기본값이 아니므로 다시 넣을 수 있다는 것입니다. 사용자가 요청을 받기 위해 선택한 것입니다.

아무도 이런 경우를 처리하는 데 가장 좋은 방법이 있습니까?

답변

0

당신은뿐만 아니라 WebSocket을에 의존뿐만 아니라 데이터베이스에 사용자의 온라인 상태를 넣어해야합니다 마이그레이션

class AddOnlineToUsers < ActiveRecord::Migration[5.0] 
    def change 
    add_column :users, :online, :boolean, default: false 
    end 
end 

이 추가 :

1 AppearanceChannel

class AppearanceChannel < ApplicationCable::Channel 
    def subscribed 

    stream_from "appearance_channel" 

    if current_user 

     ActionCable.server.broadcast "appearance_channel", { user: current_user.id, online: :on } 

     current_user.online = true 

     current_user.save! 

    end 


    end 

    def unsubscribed 

    if current_user 

     # Any cleanup needed when channel is unsubscribed 
     ActionCable.server.broadcast "appearance_channel", { user: current_user.id, online: :off } 

     current_user.online = false 

     current_user.save!  

    end 


    end 

end 
추가

가끔 웹 소켓 연결이 끊어지는 경우가 있습니다. 모든 HTML 페이지를 새로 고침 할 때 다음 두 가지 작업을 수행하십시오.

  1. 데이터베이스의 사용자 온라인 상태를 확인하십시오.
  2. 소켓에 연결하고 모양 채널에 가입하십시오.

이러한 결합 된 접근 방식은 언제든지 사용자의 온라인 상태를 안정적으로 제공합니다.

관련 문제