2012-02-09 79 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