我可以创建用户并登录,但是当我退出时,我会收到以下内容(虽然会话似乎已经结束):
/ signout 的NoMethodErrornil的未定义方法`update_attribute':NilClass
这是在SessionsHelper中的sign_out方法,其中current_user.update_attribute(...) 这是否意味着current_user是零?我该怎么做才能解决这个问题。我对RoR很新,谢谢。
这是我的SessionsHelper
module SessionsHelper
def sign_in(user)
remember_token = User.new_remember_token
cookies.permanent[:remember_token] = remember_token
user.update_attribute(:remember_token, User.encrypt(remember_token))
self.current_user = user
end
def signed_in?
!current_user.nil?
end
def current_user=(user)
@current_user = user
end
def current_user
remember_token = User.encrypt(cookies[:remember_token])
@current_user ||= User.find_by(remember_token: remember_token)
end
def sign_out
current_user.update_attribute(:remember_token, User.encrypt(User.new_remember_token))
#current_user.update_attribute(:remember_token, User.new_remember_token)
cookies.delete(:remember_token)
self.current_user = nil
end
end
这是我的SessionsController class SessionsController< ApplicationController中
def new
end
def create
user = User.find_by(email: params[:session][:email].downcase)
if user && user.authenticate(params[:session][:password])
sign_in user
redirect_to user
else
flash.now[:error] = 'Invalid email/password combination' #not quite right
render 'new'
end
end
def destroy
sign_out
redirect_to 'signin'
end
end
答案 0 :(得分:2)
如果您告诉我们您遇到此错误的具体情况会很好。
当你实际上没有登录时,你很可能会进入退出页面。
在哪种情况下 - 为什么不添加“if signed_in?”你的行动,例如:
def sign_out
return unless signed_in? # you are already signed out
current_user.update_attribute(:remember_token, User.encrypt(User.new_remember_token))
cookies.delete(:remember_token)
self.current_user = nil
end
def destroy
sign_out if signed_in?
redirect_to 'signin'
end
或者 - 您是否有skip_before_action authenticate_user
或类似的sign_out?
再次 - 注销,您必须登录...所以您不能跳过签名的身份验证操作。