我已经看过几个关于这个问题的问题,但他们都没有帮助我。所以问题是,在执行时,如果我检查记住我,我得到这个错误:
"未定义的方法`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,控制台会毫无问题地返回新令牌。
答案 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
。
希望能够清除它并帮助其他人在本教程中挣扎。 :)