2

我试图通过在用户登录时将“1”设置为 db 字段并在他注销时将“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 回答