跟随railsturial.org时未定义的方法'remember_token =“

时间:2014-10-25 06:21:49

标签: ruby-on-rails railstutorial.org

我已经看过几个关于这个问题的问题,但他们都没有帮助我。所以问题是,在执行时,如果我检查记住我,我得到这个错误:

"未定义的方法`remember_token ='对于#"

相关代码:

User.rb

#Returns a random token.
def User.new_token
  SecureRandom.urlsafe_base64
end
# Rememember a user in the database for use in persistent sessions.
 def remember 
   self.remember_token = User.new_token **# This is the row 30 where the execution stops**
   update_attribute(:remember_digest, User.digest(remember_token))
end

我已检查数据库是否有remember_digest列,因此它不是数据库列。

此代码是从session_helper.rb调用的,即来自代码:

# Remembers a user in a persistent session.
def remember(user)
  user.remember 
  cookies.permanent[:remember_token] = user.remember_token
  cookies.permament.signed[:user_id] = user.id
end

同样在我的控制台中,如果我输入User.new_token,控制台会毫无问题地返回新令牌。

3 个答案:

答案 0 :(得分:1)

  

错误:"未定义的方法`remember_token ='

您收到此错误是因为用户表没有remember_token字段。

  

我已检查数据库是否有remember_digest列,因此它不是数据库列。

当您使用self.remember_token = User.new_token时,您正尝试使用new_token方法的输出在users表中设置remember_token字段。 为什么你认为你当您将其分配给remember_token时,需要在users表中有remember_digest字段吗?

<强> FIX

如果您想实现记住我的功能,那么您可以按照此railscast进行操作。你的代码是这样的:

#User.rb
#Returns a random token.
def new_token
  SecureRandom.urlsafe_base64
end
# Rememember a user in the database for use in persistent sessions.
def remember
  self.update_attribute(:remember_digest, new_token)
end

# Remembers a user in a persistent session.
def remember(user)
  user.remember 
  cookies.permanent[:remember_token] = user.remember_digest
  cookies.permament.signed[:user_id] = user.id
end

P.S我正在使用remember_digest,因为它已经存在于您的用户表中。您可以更改它并使用更具描述性的字段,例如remember_token

答案 1 :(得分:0)

在练习rails教程时,我也遇到了这个问题。

我犯的错误是我忘了写 attr_accessor :remember_token 这是remember(user)方法无法访问变量的原因。

我也对这个问题感到沮丧,但幸运的是我找到了解决方案。

PS:检查您是否在用户模型的类(user.rb)中编写了attr_accessor :remember_token

答案 2 :(得分:0)

嘿,我正在努力解决这个问题,最后我发现Naga Sudhir的答案解决了这个问题。

事实证明我并不明白attr_accessor :remember_token实际上是我必须在用户模型类(user.rb)中输入的一行代码。

class User < ActiveRecord::Base
  attr_accessor :remember_token
  before_save { self.email = email.downcase }
  validates :first_name, presence: true, length: { maximum: 25}
  validates :last_name, presence: true, length: { maximum: 25 }
  VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
  validates :email, presence: true, length: { maximum: 255}, format: { with: VALID_EMAIL_REGEX }, uniqueness: { case_sensitive: false }
  validates :password, length: { minimum: 6 }
  has_secure_password

这允许稍后在代码中使用self.remember_token

希望能够清除它并帮助其他人在本教程中挣扎。 :)