我一直坚持这个问题,但仍无法弄清问题是什么
def sign_out
#return unless signed_in? # you are already signed out
current_user.update_attribute(:remember_token,User.digest(User.new_remember_token))
cookies.delete(:remember_token)
self.current_user = nil
end
rails在@current_user上返回一个错误,说更新属性未定义?
据我所知,我的当前用户已经由此方法定义
def current_user
remember_token = User.digest(cookies[:remember_token])
current_user ||= User.find_by(remember_token: remember_token)
end
我在这里遗漏了什么吗?如果有帮助的话,我会按照rails教程进行操作,但是在用户创建个人资料后我有点偏离并添加了一个额外的页面.....但我确定它没问题,因为我保存了@user通过做
User.find(params[:id])
或者有人可以更详细地向我解释错误吗?
谢谢
答案 0 :(得分:0)
方法current_user
将定义@current_user
实例变量,但这是出于自己的目的 - 停止它每次调用时都必须进行数据库查询。
您可以在自己的代码中访问@current_user
,但如果尚未调用current_user
,则该代码将不存在,因此将评估为nil。
因此始终使用current_user
并且从不使用@current_user
更安全。
答案 1 :(得分:0)
有人可以更详细地向我解释错误吗?
-
<强> CURRENT_USER 强>
update_attribute' for nil:NilClass
此错误与update_attribute
和所有无关,与您尝试调用该方法的对象有关 - 在您的情况下current_user
(基本上意味着current_user
未定义)
答案&amp;您已经给出的评论基本上是试图帮助定义您调用该方法的对象 - I.E current_user
需要在某处定义
通过查看代码,您需要考虑两件事:
- 是否正在创建/调用
current_user
方法?- 此方法中是否定义了正确的对象?
醇>
-
数据强>
您提供了以下方法:
def current_user
remember_token = User.digest(cookies[:remember_token])
current_user ||= User.find_by(remember_token: remember_token)
end
正如sevenseacat
所指出的,我要做的第一件事就是确保您拥有可以与remember_token
定位的用户。实际上一个重点 - 什么&#39; .digest
?。它是模型中的类方法吗?
您可能遇到的问题是尝试将User.digest
和User.find_by
与remember_token
一起使用。您知道remember_token
将在何处/如何设置?
-
方式强>
其次,您需要确保调用current_user
方法。我猜这是一个帮手方法?如果是,您确定要在控制器中调用include xxxHelper
吗?
答案 2 :(得分:0)
没关系,找到了bug。我的应用程序控制器中有一些不需要的代码