ruby-on-rails - 更新 session 超时 rails 上的属性

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

我试图通过在用户登录时将数据库字段设置为“1”,在用户注销时将数据库字段设置为“0”来创建在线用户列表。问题是 - 如果用户刚刚离开网站,“1”仍然保留在数据库中,所以我想要做的是在 session 过期时更新它。

登录:

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

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

最佳答案

您不能这样做,因为无法保证您的 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.mines.ago])

您还可以使用现有的身份验证框架,例如 Authlogic 例如,您可以免费获得该功能。

关于ruby-on-rails - 更新 session 超时 rails 上的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13901325/

相关文章:

ruby - 从现在开始获取当前 1 年作为数字

php - 带有 PHP 应用程序和用户 session 的 NodeJS

ruby-on-rails - 合并包含相同键值对的哈希

mysql - 安装 Rails、MySQL 等一切都出错了

mysql - 对不同的数据库和表进行一次性查询

ruby-on-rails - 部分 vs for 循环——最佳实践

java - CDI 事件及其传播范围

安卓持久登录

ruby-on-rails - 全面的图形和图表解决方案...?

javascript - 在railscast 114之后实现 'Endless Page' Javascript