2

ユーザーがログインするときにdbフィールドに「1」を設定し、ログアウトするときに「0」を設定して、オンラインユーザーリストを作成しようとしています。問題は、ユーザーがサイトを離れたばかりの場合でも、「1」はデータベースに残っているため、セッションの有効期限が切れたときに更新することです。

ログイン用:

def create
    user = User.find_by_username(params[:username])
    if user && user.authenticate(params[:password])
        session[:user_id] = user.id
      session[:username] = user.username
      remote_ip = request.remote_ip
      user.update_attributes(:online => 1, :ip => remote_ip) 
        redirect_to root_url
    else
        render "new"
    end
  end

ログアウトの場合:

 def destroy
    @user = User.where(:id => session[:user_id])
    @user.each do |u|
      u.update_attributes(:online => 0)
    end 
    session[:user_id] = nil
    session[:username] = nil
    redirect_to root_url
  end

誰かが私にそれを行う方法を提案できますか?

4

2 に答える 2

2

destroyアクションが呼び出されることを保証する方法がないため、そのようにすることはできません。ユーザーがインターネット接続を失った場合はどうなりますか? それともブラウザがクラッシュしますか?または、ユーザーは週末にAFKですか?

user解決策は、モデルにタイムスタンプを追加することですlast_seen_at。ユーザーがサイトで操作を実行するたびに、次のように更新しますbefore_filter

class ApplicationController < ActionController::Base
  before_filter :record_last_seen_at # TODO: Implement that method
end

次に、すべてのオンライン ユーザーを一覧表示する場合は、最後の 5 分間にアクティブだったすべてのユーザー、つまりオンラインと見なされるユーザーを一覧表示します。

User.where(['last_seen_at > ?', 5.minutes.ago])

たとえば、Authlogicなどの既存の認証フレームワークを使用することもでき、その機能を無料で利用できます。

于 2012-12-16T12:44:46.217 に答える
0

db set 1 または 0 のログインとログアウトを使用することは、実際には悪い方法です。また、last_seen_at (デバイスの使用法) を使用した上記の回答から、アクティブなセッションのリストを取得できません。

この github サンプル アプリhttps://github.com/mohanraj-ramanujam/online-usersを参照して、アクティブ レコード セッション ストアを使用してオンライン アクティブ セッション リストを一覧表示してください。

于 2013-07-15T05:25:45.030 に答える