Ruby on rails 未定义的方法“更新”属性';零级:零级
我可以创建用户并登录,但当我注销时,我会收到以下信息(尽管会话似乎已结束): NoMethodError at/signout 未定义nil:NilClass的“update_属性”方法 这在SessionHelper中的sign_out方法上,其中当前的_user.update_属性(…) 这是否意味着当前用户为零?我能做些什么来修复这个。我对RoR很陌生,谢谢 这是我的会话助手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
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
这是我的会话控制器
类sessioncontrollerdef 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过滤器,否则我无法确定这一点。如果上面是您编写的代码。。。然后问题是,您需要在您应该登录的每个操作(包括注销页面)上设置当前用户。。。