未初始化常量 User::BCrypt(与版本相关?)

uninitialized constant User::BCrypt (version related?)

我收到错误 "uninitialized constant User::BCrypt"。

我检查了这个问题:https://github.com/ryanb/nifty-generators/issues/68

建议的捆绑安装解决方案不起作用(当然,我经常捆绑安装)。

我检查了这个问题:https://github.com/codahale/bcrypt-ruby/issues/89

将 gem 更改为 'bcrypt-ruby' 而不仅仅是 'bcrypt' 的建议解决方案确实将我的 gem 更新为更新版本,但没有解决问题。

这是我的用户模型

class User < ActiveRecord::Base
  validates :username, :password_digest, :session_token, presence: true
  validates :session_token, uniqueness: true
  attr_reader :password

  def self.find_by_credentials(username, password)
    user = User.find_by_username(username)
    user.try(:valid_password?, password) ? user : nil
  end

  def valid_password?(password)
    BCrypt::Password.new(self.password_digest).is_password?(password)
  end

  def password=(password)
    @password = password
    self.password_digest = BCrypt::Password.create(password)
  end

  def reset_session_token
    self.session_token = SecureRandom.urlsafe_base64
    self.save!
    self.session_token
  end
end

据我所知,我看不到在您的用户模型中需要 'bcrypt'

require 'bcrypt'
class User < ActiveRecord::Base
 ...
end

除非您的应用程序纯粹用于学习目的,否则您应该认真考虑使用 rails 中内置的 ActiveModel::SecurePassword

重新发明身份验证轮是最常见的安全故障之一。

# make sure your users table has a password_digest column!
class User < ActiveRecord::Base
  has_secure_password
end

您也不想在数据库中的用户模型上存储会话令牌。相反,您应该使用 Rails 内置会话机制。

rails 中间件在 cookie 中向所有访问者发出一个会话标识符。 cookie 只包含一个 32 字节长的 MD5 散列,它链接到会话存储(默认情况下存储在另一个 cookie 中)。

您可以随时通过调用 reset_session 使会话无效。

事实上,您的模型不应该以任何方式知道会话。

参见: