web-dev-qa-db-ja.com

RailsでDeviseを使用する「Who's Online」

Devise on Railsを使用して、現在アクティブなセッションを持っているすべてのユーザー、つまり現在ログインしているユーザーを一覧表示する方法はありますか?

Ps。 この質問のような単純なものではなく、堅牢なソリューションを探しています

41
Zabba

https://github.com/ctide/devise_lastseenable

私が書いたこの宝石を使用して、ユーザーの「last_seen」タイムスタンプを保存できます。そこから、過去5分間または10分間にlast_seenであったユーザーを表示するのは非常に簡単です。

24
ctide

ApplicationControllerにafter_filterを追加するだけです

after_filter :user_activity

private

def user_activity
  current_user.try :touch
end

次に、ユーザーモデルにオンラインで追加しますか?方法

def online?
  updated_at > 10.minutes.ago
end

また、スコープを作成できます

scope :online, lambda{ where("updated_at > ?", 10.minutes.ago) }
84
Yuri Barbashov

あなたはすべてのデータベースへの旅行をすることによって悩まされている場合。シングル。 http。リクエスト。ユーザーがオンラインであると想定できる小さなウィンドウのみが表示されます。別の解決策があります。

Websocketとredisを使用すると、コストのかかるディスクへの書き込みを行わなくても、ミリ秒までユーザーのオンラインステータスを確実に取得できます。残念ながら、それはかなり多くの作業を必要とし、2つの追加の依存関係がありますが、もし誰かが興味があれば、私はここでかなり詳細な書き込みをしました:

ユーザーがオンラインかどうかを確認するにはどうすればよいですか?

20
Ryan Epp

私はこれの別のバージョンを実装したばかりで、それが他の誰かを助ける場合に備えて共有したいと思いました。

Usersテーブルにlast_sign_out_at列を追加し、Deviseセッションコントローラをサブクラス化するだけで、セッションが破棄された(ユーザーがサインアウトした)ときにdestroyメソッドをオーバーライドして設定できます。

# app/controllers

class SessionsController < Devise::SessionsController

  def destroy
    current_user.update_attribute(:last_sign_out_at, Time.now)
    super
  end

end

そして、私のUserモデルには、ユーザーがオンラインかどうかを確認する方法があります。

class User < ActiveRecord::Base

  def online?
    if current_sign_in_at.present? 
      last_sign_out_at.present? ? current_sign_in_at > last_sign_out_at : true
    else
      false
    end
  end

end

また、ルートで新しいセッションコントローラを使用するようにDeviseに指示する必要があります。

1
mchapman17

アクティブレコードセッションストアを使用して、現在アクティブなセッションを一覧表示できます。 githubアプリのページ https://github.com/mohanraj-ramanujam/online-users をご覧ください。

0
Mohanraj