nil的未定义方法`update_attribute':NilClass

时间:2014-02-23 23:29:11

标签: ruby-on-rails session railstutorial.org

我可以创建用户并登录,但是当我退出时,我会收到以下内容(虽然会话似乎已经结束):

/ signout

的NoMethodError

nil的未定义方法`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

1 个答案:

答案 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?

再次 - 注销,您必须登录...所以您不能跳过签名的身份验证操作。