未定义的方法`update_attribute'为零:NilClass,退出

时间:2014-06-06 08:20:35

标签: ruby-on-rails

我一直坚持这个问题,但仍无法弄清问题是什么

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])

或者有人可以更详细地向我解释错误吗?

谢谢

3 个答案:

答案 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需要在某处定义


通过查看代码,您需要考虑两件事:

  
      
  1. 是否正在创建/调用current_user方法?
  2.   
  3. 此方法中是否定义了正确的对象?
  4.   

-

数据

您提供了以下方法:

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.digestUser.find_byremember_token一起使用。您知道remember_token将在何处/如何设置?

-

方式

其次,您需要确保调用current_user方法。我猜这是一个帮手方法?如果是,您确定要在控制器中调用include xxxHelper吗?

答案 2 :(得分:0)

没关系,找到了bug。我的应用程序控制器中有一些不需要的代码