使用数据库会话存储与其他应用程序共享Rails会话

时间:2012-02-09 21:55:57

标签: ruby-on-rails devise session-storage

设计 gem用于身份验证。

Rails会话存储在数据库中。

为了使用Rails 3之外的会话,我创建了一个名为Session的模型。已将user_id列添加到sessions表格。

当用户登录时,我应该在会话表中更新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被破坏了,我最终在数据库中的另一个会话中显示空白user_id

成功登录后写一次user_id的最佳方法是什么?

1 个答案:

答案 0 :(得分:1)

JoséValim(Devise)回答:

  

自Rails 3.1起,Warden在用户登录时设置:renew选项,强制销毁旧会话并创建新会话。

所以我最终要做的是在update_session中创建ApplicationController过滤器。

  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。