Rails 3:在活动记录中存储会话(不是cookie)

我拖了谷歌大学大约一个小时左右,但没有一个关于这个主题的好文档:-(希望有人可以提供帮助。我愿意买一本书,只要有人可以告诉我哪一本。

我使用以下版本:

  • rails 3.2.6,
  • ruby 1.9.3p194(2012-04-20修订版35410)[x86_64-darwin11.4.0]

要开始在Active Record中使用会话存储而不是cookie,我做了以下操作:

  1. 更新config/initializers/session_store.rb评论第一行并取消注释最后一行,所以我有:

     # Be sure to restart your server when you modify this file. # Myapp::Application.config.session_store :cookie_store, key: '_elegato_session' # Use the database for sessions instead of the cookie-based default, # which shouldn't be used to store highly confidential information # (create the session table with "rails generate session_migration") Myapp::Application.config.session_store :active_record_store 
  2. rake db:sessions:create

     invoke active_record create db/migrate/20120729025112_add_sessions_table.rb 
  3. rake db:migrate

     == CreateLinkedinUsers: migrating ============================================ -- create_table(:linkedin_users) -> 0.0236s == CreateLinkedinUsers: migrated (0.0237s) =================================== == AddSessionsTable: migrating =============================================== -- create_table(:sessions) -> 0.0012s -- add_index(:sessions, :session_id) -> 0.0006s -- add_index(:sessions, :updated_at) -> 0.0006s == AddSessionsTable: migrated (0.0026s) ====================================== 
  4. 要找出实际创建的表,我打开sqlite3文件

     sqlite> .schema sessions CREATE TABLE "sessions" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "session_id" varchar(255) NOT NULL, "data" text, "created_at" datetime NOT NULL, "updated_at" datetime NOT NULL); CREATE INDEX "index_sessions_on_session_id" ON "sessions" ("session_id"); CREATE INDEX "index_sessions_on_updated_at" ON "sessions" ("updated_at"); 

因此,会话表中有一个“数据”字段,用于存储与会话相关的所有内容。

现在,关于我的问题:-)

我需要在session中存储2个变量的值:access_token和request_token。 我可以使用以下? (我用来存储cookie的会话值的方式)

 session[:access_token] =  session[:request_token] = <some other blah? 

如果确实有效,ruby会将表中“data”字段中的两个变量存储为数组。

非常感谢您的帮助!

所有会话变量都使用会话表的数据列中的Base64进行序列化。 如果使用cookie会话存储分配和检索值,则可以像使用它一样使用它。 在数据库中存储会话变量有一些很好的好处,比如只在每个请求期间传输session_id,而不是从cookie中传输整个会话,通过检查其年龄来管理陈旧或旧会话的能力(created_at / updated_at),以及能够存储比cookie更多的信息。

您也可以提供自己的Session类,请查看SessionStore类中的文档: https : //github.com/rails/rails/blob/5edfc463484827df364a1e589677d5c84dfac282/activerecord/lib/active_record/session_store.rb

你通常不必过多关心Rails如何存储会话,它是透明的。 如果您使用cookie商店或ActiveRecord商店,您的代码将不会更改。

所以,是的,你可以做你以前做过的事情。 从技术上讲,包含会话的序列化字符串存储在data字段中,但它并不重要:)

但是我建议使用cookie存储,除非你有充分的理由使用ActiveRecord(在会话中超过4K数据?)