我按照 Michael Hartl 的教程为我的应用程序提供了一个身份验证系统,但我一直收到此 remember_token 方法错误:
undefined method `remember_token=' for #<User:0x00000005e44238>
我不明白为什么 remember_token 是未定义的,因为 Hartl 的教程说它是由我相信的 remember 方法自动生成的。
这是应用程序跟踪:
app/models/user.rb:23:in `remember'
app/helpers/sessions_helper.rb:10:in `remember'
app/controllers/sessions_controller.rb:11:in `create'
相关用户.rb:
def User.digest(string)
cost = ActiveModel::SecurePassword.min_cost ? BCrypt::Engine::MIN_COST :
BCrypt::Engine.cost
BCrypt::Password.create(string, cost: cost)
end
def User.new_token
SecureRandom.urlsafe_base64
end
def remember
self.remember_token = User.new_token
update_attribute(:remember_digest, User.digest(remember_token))
end
session Controller :
class SessionsController < ApplicationController
def new
end
def create
user = User.find_by(email: params[:session][:email].downcase)
if user && user.authenticate(params[:session][:password])
log_in user
params[:session][:remember_me] == '1' ? remember(user) : forget(user)
remember user
redirect_back_or user
else
# Create an error message.
flash.now[:danger] = 'Invalid email/password combination' # Not quite right!
render 'new'
end
end
def destroy
forget(current_user)
session.delete(:user_id)
@current_user = nil
redirect_to root_url
end
end
相关 session 助手:
def remember(user)
user.remember
cookies.permanent.signed[:user_id] = user.id
cookies.permanent[:remember_token] = user.remember_token
end
def forget(user)
user.forget
cookies.delete(:user_id)
cookies.delete(:remember_token)
end
# Returns the current logged-in user (if any).
def current_user
if (user_id = session[:user_id])
@current_user ||= User.find_by(id: user_id)
elsif (user_id = cookies.signed[:user_id])
user = User.find_by(id: user_id)
if user && user.authenticated?(cookies[:remember_token])
log_in user
@current_user = user
end
end
end
最佳答案
我猜您跳过了必须向数据库添加新列 remember_token
的部分(参见:列表 8.16
https://www.railstutorial.org/book/sign_in_out#cha-sign_in_sign_out )
如果您执行了该步骤,则需要迁移数据库并重新启动服务器:
$ bundle exec rake db:migrate
$ touch tmp/restart.txt
关于ruby-on-rails - 无法弄清楚这个 Rails 错误 : undefined method `remember_token=' for #<User:0x00000005e44238>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26006954/