您的位置:首页 > 编程语言 > Ruby

ruby on rails session 深入探索

2012-05-07 12:03 531 查看
有这样的一个需求:

需要取得网站所有的在线用户的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.data
session.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!

太诡异了,具体原因还不清楚
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: