Ruby on rails 未定义的方法“更新”属性';零级:零级

Ruby on rails 未定义的方法“更新”属性';零级:零级,ruby-on-rails,session,railstutorial.org,Ruby On Rails,Session,Railstutorial.org,我可以创建用户并登录,但当我注销时,我会收到以下信息(尽管会话似乎已结束): NoMethodError at/signout 未定义nil:NilClass的“update_属性”方法 这在SessionHelper中的sign_out方法上,其中当前的_user.update_属性(…) 这是否意味着当前用户为零?我能做些什么来修复这个。我对RoR很陌生,谢谢 这是我的会话助手 module SessionsHelper def sign_in(user) remember_tok

我可以创建用户并登录,但当我注销时,我会收到以下信息(尽管会话似乎已结束):

NoMethodError at/signout

未定义nil:NilClass的“update_属性”方法

这在SessionHelper中的sign_out方法上,其中当前的_user.update_属性(…) 这是否意味着当前用户为零?我能做些什么来修复这个。我对RoR很陌生,谢谢

这是我的会话助手

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
这是我的会话控制器 类sessioncontroller
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

如果你能告诉我们你犯这个错误的确切情况,那就太好了

很有可能您在当前未实际登录的情况下进入注销页面

在这种情况下,为什么不在您的操作中添加“如果已登录?”例如:

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\u-before\u-action\u-authenticate\u-user
或类似的注销功能


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

当我添加“如果已登录”时,这一操作起到了作用。这是否意味着我以前的问题是因为没有登录?或者可能是我退出了两次?是的。:)除非您向我们展示设置当前用户和(更重要的是)调用它的操作的before过滤器,否则我无法确定这一点。如果上面是您编写的代码。。。然后问题是,您需要在您应该登录的每个操作(包括注销页面)上设置当前用户。。。