Rails教程9.12测试报错:nil:NilClass未定义forget方法求助
问题分析与解决方案
这个报错NoMethodError: undefined method 'forget' for nil:NilClass的根源很明确:当你第二次调用logout_path时,用户已经登出,current_user返回了nil,而你的log_out方法直接把nil传给了forget方法。
看你的测试代码,这段是触发问题的关键:
delete logout_path assert_not is_logged_in? assert_redirected_to root_url # Simulate a user clicking logout in a second window. delete logout_path # 这里是第二次调用登出接口 follow_redirect!
第一次执行delete logout_path后,用户已经成功登出:session[:user_id]被删除,@current_user被设为nil。这时候第二次调用登出接口,log_out方法里的current_user就是nil,执行forget(current_user)自然会触发nil调用方法的错误。
修复方案
修改SessionsHelper里的log_out方法,先判断current_user是否存在,再执行forget操作:
def log_out # 只有当current_user存在时才调用forget forget(current_user) if current_user session.delete(:user_id) @current_user = nil end
或者你也可以给forget方法加一个安全判断,避免传入nil的情况:
def forget(user) return unless user # 如果user是nil,直接返回不执行后续逻辑 user.forget cookies.delete(:user_id) cookies.delete(:remember_token) end
两种方案都能解决问题,不过第一种更合理——既然用户已经登出了,就没必要再执行遗忘持久会话的操作了。
另外检查了你的current_user方法,逻辑是正常的:当session和cookie里都没有用户ID时,返回nil,符合预期。
内容的提问来源于stack exchange,提问作者Jonathan Scialpi
相关产品推荐
相关产品推荐

