ruby on rails session 深入探索
2012-05-07 12:03
531 查看
有这样的一个需求:
需要取得网站所有的在线用户的session, 并且能通过session_id 找到对应的用户
session保存到数据库中
修改配置文件
如何从数据库中取得session,并且对应user_id?
然后取用户数据
补充说明-----------------------------------------------------------------------------
在使用
所以,当显示该异常的时候,代码需要修改为
注意的地方是:
User.first 一定需要调用一次,否则
Marshal.load 将无法识别 User!
太诡异了,具体原因还不清楚
需要取得网站所有的在线用户的session, 并且能通过session_id 找到对应的用户
session保存到数据库中
修改配置文件
config.action_controller.session_store = :active_record_store运行
rake db:sessions:create
如何从数据库中取得session,并且对应user_id?
ActiveRecord::SessionStore::SqlBypass.connection() #初始化connect session = ActiveRecord::SessionStore::SqlBypass.find_by_session_id(session_id) session.datasession.data的数据如下
{:_csrf_token=>"MxXYJUUvtlazW2xani9B4hWQTX5hxLRG38eeHoUq8S0=", "warden.user.user.key"=>[User(id: integer, email: string, encrypted_password: string, password_salt: string, reset_password_token: string, remember_token: string, remember_created_at: datetime, sign_in_count: integer, current_sign_in_at: datetime, last_sign_in_at: datetime, current_sign_in_ip: string, last_sign_in_ip: string, created_at: datetime, updated_at: datetime, username: string, pwd: string, phone: string, visited: integer, avatar_file_name: string, avatar_content_type: string, avatar_file_size: integer, avatar_updated_at: datetime, apple_token: string, client: string), 2], "flash"=>{:notice=>"注册成功.", :error=>nil, :user_signed_up=>true, :alert=>nil}}
然后取用户数据
User.find_by_id(sess.data["warden.user.user.key"].last)
补充说明-----------------------------------------------------------------------------
在使用
ActiveRecord::SessionStore::SqlBypass.connection() #初始化connect session = ActiveRecord::SessionStore::SqlBypass.find_by_session_id(session_id) session.data取session data的时候,会抛出如下异常
ActiveRecord::StatementInvalid (Mysql::Error: query: not connected: SELECT * FROM sessions WHERE session_id='9ba7d546733f6b50069d760a8e03829e')
所以,当显示该异常的时候,代码需要修改为
sid = params[:sid] connection = ActiveRecord::Base.connection sql = "select * from sessions where session_id = '#{sid}'" record = connection.select_one(sql) data = record["data"] logger.info data User.first str = ActiveSupport::Base64.decode64 data ss = Marshal.load(str) @user = User.find_by_id(ss["warden.user.user.key"].last)
注意的地方是:
User.first 一定需要调用一次,否则
Marshal.load 将无法识别 User!
太诡异了,具体原因还不清楚
相关文章推荐
- Ruby on rails开发从头来(windows)(八)-使用Session创建购物车(修正原版错误)
- Ruby on Rails学习笔记3-数据库保存session
- [转载]Ruby on Rails:开源技术将深入企业
- ruby on rails的session
- [ruby on rails] 深入(1) ROR的一次request的响应过程
- Ruby on rails开发从头来(windows)(八)-使用Session创建购物车
- Ruby on Rails Session 1: How to Build a Ruby on Rails on the Ubuntu.
- 深入理解Ruby on Rails中的缓存机制
- 跨域session过期的BUG已经修复 Ruby on Rails - www.9fav.com
- Ruby on Rails探索(一)——安装
- Ruby on Rails探索(二)——Hello World!
- Ruby on rails开发从头来(windows)(八)-使用Session创建购物车
- Ruby on rails开发从头来(windows)(八)-使用Session创建购物车
- Ruby on Rails Session 2: How to install Aptana Studio 3 on Ubuntu 12.04 LTS
- [ruby on rails] 深入(2) ruby基本语法
- 解决Ruby On Rails下使用SwfUpload等Flash上传组件取不到Session
- Ruby on rails开发从头来(windows)(八)-使用Session创建购物车
- ruby on rails中的session & cookies整理
- ruby on rails 一瞥