2

设计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的内容被破坏了,我最终在 DB 中获得了另一个带有空白的会话user_id

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

4

1 回答 1

1

José Valim (Devise) 回答:

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

所以我最终做的是update_sessionApplicationController.

  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 缓存 DB 查询,因此不会有实际的 SQL 调用来从sessions表中获取会话。它已经在记忆中了。更新也是如此。Rails 只会user_id在第一次更新。所有其他时间UPDATE查询都不会转到 DBMS。

于 2012-02-11T14:14:11.037 回答