Rails 教程第 8 章。 Michael Hartl - 未定义的方法 remember_token
Rails Tutorial Ch8. Michael Hartl - Undefined method remember_token
我正在关注 Michael Hartl 的 railstutorial.org,但在第 8 章尝试在登录后记住用户时遇到了障碍。问题是我得到一个未定义的方法 remember_token。我已经完成并重新完成了所有步骤,reset/rolledback 数据库几次并重新迁移,完成了我能找到的所有堆栈溢出问题,但没有任何效果。
我还对语法进行了三重检查,它的列表如教程中所示。该程序能够创建用户,在注册和注销后显示用户配置文件。当我注销并尝试为该用户重新登录时,未知方法会被标记。 Whosebug 上的很多答案都说数据库中没有匹配的模式,但我已经重新迁移并检查了它,一切都是匹配的。包括几个 DB:drop 命令,然后是 DB:migrate。
教程中给我带来麻烦的部分从 8.4.1 记住令牌和摘要开始,第 8 章 link:https://www.railstutorial.org/book/log_in_log_out
我很感激你的帮助,似乎无法摆脱这个!
完整的错误信息:
Picture of error message
**Error message received through the test:**
ERROR["test_login_with_valid_inforamtion_followed_by_logout", UsersLoginTest, 2016-01-20 10:04:41 +0000]
test_login_with_valid_inforamtion_followed_by_logout#UsersLoginTest (1453284281.57s)
NoMethodError: NoMethodError: undefined method `remember_token=' for #<User:0x00000009688838>
app/models/user.rb:28:in `remember'
app/helpers/sessions_helper.rb:10:in `remember'
app/controllers/sessions_controller.rb:10:in `create'
test/integration/users_login_test.rb:24:in `block in <class:UsersLoginTest>'
app/models/user.rb:28:in `remember'
app/helpers/sessions_helper.rb:10:in `remember'
app/controllers/sessions_controller.rb:10:in `create'
test/integration/users_login_test.rb:24:in `block in <class:UsersLoginTest>'
user.rb 文件
class User < ActiveRecord::Base
attr_accessor :remeber_token
#Returns the hash digest of the given string
def User.digest(string)
cost = ActiveModel::SecurePassword.min_cost ? BCrypt::Engine::MIN_COST : BCrypt::Engine.cost
BCrypt::Password.create(string, cost: cost)
end
#Returns a random token
def User.new_token
SecureRandom.urlsafe_base64
end
#Remembers a user in the database for use in persisten sessions
def remember
self.remember_token = User.new_token
update_attribute(:remember_digest, User.digest(remember_token))
end
def authenticated?(remember_token)
BCrypt::Password.new(remember_digest).is_password?(remember_token)
end
end
users_controller.rb
class UsersController < ApplicationController
def show
@user = User.find(params[:id])
end
def new
@user = User.new
end
def create
@user = User.new(user_params)
if @user.save
log_in @user
flash[:success] = "Welcome to the Sample App!"
redirect_to @user
else
render 'new'
end
end
private
def user_params
params.require(:user).permit(:name, :email, :password, :password_confirmation)
end
end
sessions_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
remember user
redirect_to user
else
flash.now[:danger] = 'Invalid email/password combination'
render 'new'
end
end
def destroy
log_out
redirect_to root_url
end
end
sessions_helper.rb
module SessionsHelper
# Logs in the given user.
def log_in(user)
session[:user_id] = user.id
end
# Remembers a user in a persistent session.
def remember(user)
user.remember
cookies.permanent.signed[:user_id] = user.id
cookies.permanent[:remember_token] = user.remember_token
end
# Returns the user corresponding to the remember token cookie.
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
# Returns true if the user is logged in, false otherwise.
def logged_in?
!current_user.nil?
end
# Logs out the current user.
def log_out
session.delete(:user_id)
@current_user = nil
end
end
_add_remember_digest_to_users.rb
class AddRememberDigestToUsers < ActiveRecord::Migration
def change
add_column :users, :remember_digest, :string
end
end
attr_accessor :remeber_token
你打错了。
以上代码需要为:
attr_accessor :remember_token
我正在关注 Michael Hartl 的 railstutorial.org,但在第 8 章尝试在登录后记住用户时遇到了障碍。问题是我得到一个未定义的方法 remember_token。我已经完成并重新完成了所有步骤,reset/rolledback 数据库几次并重新迁移,完成了我能找到的所有堆栈溢出问题,但没有任何效果。
我还对语法进行了三重检查,它的列表如教程中所示。该程序能够创建用户,在注册和注销后显示用户配置文件。当我注销并尝试为该用户重新登录时,未知方法会被标记。 Whosebug 上的很多答案都说数据库中没有匹配的模式,但我已经重新迁移并检查了它,一切都是匹配的。包括几个 DB:drop 命令,然后是 DB:migrate。
教程中给我带来麻烦的部分从 8.4.1 记住令牌和摘要开始,第 8 章 link:https://www.railstutorial.org/book/log_in_log_out
我很感激你的帮助,似乎无法摆脱这个! 完整的错误信息: Picture of error message
**Error message received through the test:**
ERROR["test_login_with_valid_inforamtion_followed_by_logout", UsersLoginTest, 2016-01-20 10:04:41 +0000]
test_login_with_valid_inforamtion_followed_by_logout#UsersLoginTest (1453284281.57s)
NoMethodError: NoMethodError: undefined method `remember_token=' for #<User:0x00000009688838>
app/models/user.rb:28:in `remember'
app/helpers/sessions_helper.rb:10:in `remember'
app/controllers/sessions_controller.rb:10:in `create'
test/integration/users_login_test.rb:24:in `block in <class:UsersLoginTest>'
app/models/user.rb:28:in `remember'
app/helpers/sessions_helper.rb:10:in `remember'
app/controllers/sessions_controller.rb:10:in `create'
test/integration/users_login_test.rb:24:in `block in <class:UsersLoginTest>'
user.rb 文件
class User < ActiveRecord::Base
attr_accessor :remeber_token
#Returns the hash digest of the given string
def User.digest(string)
cost = ActiveModel::SecurePassword.min_cost ? BCrypt::Engine::MIN_COST : BCrypt::Engine.cost
BCrypt::Password.create(string, cost: cost)
end
#Returns a random token
def User.new_token
SecureRandom.urlsafe_base64
end
#Remembers a user in the database for use in persisten sessions
def remember
self.remember_token = User.new_token
update_attribute(:remember_digest, User.digest(remember_token))
end
def authenticated?(remember_token)
BCrypt::Password.new(remember_digest).is_password?(remember_token)
end
end
users_controller.rb
class UsersController < ApplicationController
def show
@user = User.find(params[:id])
end
def new
@user = User.new
end
def create
@user = User.new(user_params)
if @user.save
log_in @user
flash[:success] = "Welcome to the Sample App!"
redirect_to @user
else
render 'new'
end
end
private
def user_params
params.require(:user).permit(:name, :email, :password, :password_confirmation)
end
end
sessions_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
remember user
redirect_to user
else
flash.now[:danger] = 'Invalid email/password combination'
render 'new'
end
end
def destroy
log_out
redirect_to root_url
end
end
sessions_helper.rb
module SessionsHelper
# Logs in the given user.
def log_in(user)
session[:user_id] = user.id
end
# Remembers a user in a persistent session.
def remember(user)
user.remember
cookies.permanent.signed[:user_id] = user.id
cookies.permanent[:remember_token] = user.remember_token
end
# Returns the user corresponding to the remember token cookie.
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
# Returns true if the user is logged in, false otherwise.
def logged_in?
!current_user.nil?
end
# Logs out the current user.
def log_out
session.delete(:user_id)
@current_user = nil
end
end
_add_remember_digest_to_users.rb
class AddRememberDigestToUsers < ActiveRecord::Migration
def change
add_column :users, :remember_digest, :string
end
end
attr_accessor :remeber_token
你打错了。
以上代码需要为:
attr_accessor :remember_token