2014-02-23 67 views
0

我能够创建用户并登录,但是当我登出我收到以下(尽管会议没有出现结束):未定义的方法`update_attribute”的零:NilClass

NoMethodError在/ signout

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

回答

2

,如果你告诉我们什么确切的情况是,你得到这个错误就好。

当你目前没有登录时,你很可能会去注销页面。

在这种情况下 - 为什么不添加“如果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?

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

+0

这工作时,我添加'如果signed_in'。这是否意味着我之前的问题来自于未登录?或者可能是我退出了两次? – justchilly

+0

是的。 :)除非你向我们展示设置current_user和(更重要的)设置哪个动作的before-filter,否则我无法分辨。如果上述内容是* ao *您编写的代码...那么问题是您需要在您应该登录的每个操作(包括注销页面)上设置current_user ... –

相关问题