current_user 使用 mongoid 和设计时成功 sign_in 后为零

current_user nil after successful sign_in while using mongoid and devise

对于上下文,我使用的是 devise 3.4.1,mongoid 4.0.0,rails 4.1.7

当我(成功)登录时,我被重定向到我的 after_sign_in_path_for 指定的根路径。从这里开始,我假设我的用户已登录。但是,一旦我导航到另一个在控制器方法中引用 current_user 的页面,我就会收到如下错误:

undefined method `searches' for nil:NilClass

提取的源代码(第 6 行附近):

@current_search = current_user.searches.build

if(params[:role].present?)
  @current_search.add_condition(role: "#{params[:role]}")

为了进一步了解我调试会话的问题,一切似乎都没有问题:

{"session_id"=>"bbae2e07d3d3e506ad662410b23cefb7",    
"warden.user.user.key"=>[["54f787e0636c612b75ba0000"], 
"a$xvDkF6vFs.bHAa3rjsvPR."], 
"flash"=>{"discard"=>[], "flashes"=>{"notice"=>"Signed in 
successfully."}}, 
"_csrf_token"=>"/OVXffT6+er8OipE47/gOs0w9mbK9s/XqgwFOyiSumA="}

其他一些似乎有类似问题的人似乎只能通过调用 before_action :authenticate_user! 来修复它,但在我的情况下它只会生成 401 Unauthorized 错误并重定向用户使用 You need to sign in or sign up before continuing.

的对话框再次进入登录页面

problem/solution 在黑客中撒谎...所以有一段时间我一直在成功地使用它:

def self.serialize_from_session(key, salt)
  record = to_adapter.get(key[0]["$oid"])
  record if record && record.authenticatable_salt == salt
end

但我不得不用

替换它
def self.serialize_into_session(record)
  [record.id.to_s, record.authenticatable_salt]
end 

.. 如果有人能解释一下,我很想更好地理解这里发生的事情

//更新

实际上,现在根本不需要破解了。我认为这个问题一定已经被 mongoid 团队解决了。