2012-02-09 85 views
2

設計 gem用於身份驗證。使用DB會話存儲與其他應用程序共享Rails會話

將導軌會話存儲在數據庫的中。

爲了使用Rails 3以外的會話,我創建了一個名爲Session的模型。 sessions表中增加了user_id列。

當用戶登錄時,我應該更新會話表中的user_id列。因此,在ApplicationController我添加了一個方法:

protected 
    def after_sign_in_path_for(resource) 
    @session = Session.find_by_session_id(request.session_options[:id]) 
    @session.update_attribute(:user_id, current_user.id) 
    stored_location_for(resource) || root_path if @session.save 
    end 

但剛過重定向,近期session被摧毀,我結束了在DB另一個會話一個空白user_id

登錄成功後寫入user_id一次的最佳方法是什麼?

回答

1

何塞·Valim(的設計)回答:

因爲Rails的3.1,監獄長設置:更新選項時,在用戶的跡象,迫使舊會話被破壞,創造一個新的。

所以我最終做的是在ApplicationController中創建update_session過濾器。

before_filter :update_session 

    protected 
    def update_session 
    if user_signed_in? 
     @session = Session.find_by_session_id(request.session_options[:id]) 
     @session.update_attribute(:user_id, current_user.id) 
    end 
    end 

由於Rails的緩存數據庫查詢也不會有實際的SQL調用從sessions表中獲取會話。它已經在記憶中。更新也是如此。 Rails將只會第一次更新user_id。所有其他時間UPDATE查詢不會去DBMS。

+0

順便說一句,''session'不需要使用實例變量。 – 2012-05-25 18:01:01