更新会话超时轨道上的属性

时间:2012-12-16 12:33:39

标签: ruby-on-rails ruby session update-attributes

我正在尝试通过在用户登录时将“1”设置为db字段来创建在线用户列表,并在他注销时将“0”设置为“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

有人可以建议我怎么做吗?

2 个答案:

答案 0 :(得分:2)

你不能这样做,因为无法保证你的destroy动作会被调用。如果用户丢失了他的互联网连接怎么办?或者浏览器崩溃了?或者周末用户是AFK?

解决方案是在user模型上添加时间戳,例如last_seen_at,并在用户对您的网站执行操作时更新,例如使用before_filter:< / p>

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 ,并且您可以免费获得该功能。

答案 1 :(得分:0)

通过使用db set 1或0登录和注销实际上是不好的方式,同样从上面的回答使用last_seen_at(设计用法)我们将无法获得活动会话列表。

请参阅此github示例应用https://github.com/mohanraj-ramanujam/online-users以列出使用活动记录会话存储的在线活动会话列表。