2009-05-25 30 views
1

警告:其中的一些可能是非常錯誤的,所以如果我的假設不正確,請讓我知道。帶有ActiveRecord會話和Restful-authentication的Rails:會話表何時寫入?

這裏就是我試圖完成:

我使用的是寧靜的身份驗證登錄。但是,因爲我使用flex/ruby​​_amf作爲我的UI,所以我必須單獨驗證Flex中的每個連接。

我決定這樣做的方式是讓登錄屏幕重定向到嵌入式Flash頁面,將會話ID作爲flashvar插入。 Flash應用程序會爲每個請求發送會話ID,並且在所有相關控制器上都會先過濾一次,以檢查與會話ID標識的會話關聯的用戶是否已登錄。

我將用戶與會話相關聯的方式是在會話表中添加一個'user_id'列,並執行一個sql「update sessions set user_id ...'」類型的查詢,該查詢從登錄函數調用。

但是,user_id僅在用戶第二次登錄時纔會更新。稍微調查顯示會話表中的記錄在執行登錄功能期間尚不存在。

所以,如果一切到這一點是有道理的,並符合最佳實踐等等,那麼我的問題是:

在什麼時間點是在會話表中的記錄產生的?有沒有辦法更新登錄函數中的會話對象,並讓rails爲我寫入user_id到數據庫?

在rails中會話的行爲對我來說是一個真正的謎。我會很感激任何幫助。

謝謝。

+0

PS:我在這裏找到了關於更新會話表的討論: http://www.nabble.com/Rails-2.3-Sessions-td22720164.html – krispyfi 2009-05-25 04:20:19

回答

1

在Rails 2.3中,會話在Rack應用程序完成處理後保存。在傳統的Rails應用程序中,這將在請求被完全處理之後:在過濾器,控制器動作,視圖渲染和過濾器之前。查看actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/session/abstract/id.rb

如果你仔細想想,這是非常有意義的。每次在會話中放置某些內容時,將會話寫入它的存儲將會產生很多額外的開銷。

它是Rails,所以如果你想充分利用它,當然,你可以用自己的方式編寫會話以隨時隨地存儲。我不推薦它。隨着Rails的不斷髮展,您最終必須不斷修改代碼。

對於ActiveRecord :: SessionStore,一行確實映射到一個會話。 data列是您放入會話中的每個對象的編碼形式。每次請求進入時,Rails必須通過創建之前存儲在其中的所有對象的新實例來重建會話。