设计 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
的最佳方法是什么?
答案 0 :(得分:1)
自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。