【问题标题】:rails 4.2.4 Uninitialized Constant User::BCRYPTrails 4.2.4 未初始化的常量用户::BCRYPT
【发布时间】:2015-11-23 17:29:15
【问题描述】:

我有一个带有登录身份验证的 Rails 应用程序,我从 Micheal Hartl 的 RoR 教程中获得。登录有一个记住我的 cookie 登录。问题是当用户 cookie 存在并且我启动我的 rails 应用程序时,我得到了这个错误

Processing by PagesController#index as HTML
User Load (1.0ms)  SELECT  `users`.* FROM `users` WHERE `users`.`id` = 37 LIMIT 1
Completed 500 Internal Server Error in 6ms (ActiveRecord: 1.0ms)
NameError (uninitialized constant User::BCRYPT):
app/models/user.rb:30:in `authenticated?'
app/helpers/sessions_helper.rb:12:in `current_user'
app/helpers/sessions_helper.rb:20:in `logged_in?'
app/controllers/pages_controller.rb:5:in `index'

在没有记住我的情况下登录可以正常工作。我已经尝试过我发现的解决方案,例如在 gemfile 或用户模型中放置 require 标记。我什至将我的 ruby​​ 从 2.2.3 降级到 2.1.7 看看它是否会修复,但它没有。

这是我的用户模型

require 'bcrypt'

class User < ActiveRecord::Base
  attr_accessor :remember_token
  has_many :crates, dependent: :destroy
  before_save { self.email = email.downcase }
  validates :alias, presence:true, length: {maximum: 50}, uniqueness:{case_sensitive: true}
  validates :email, presence:true, length:{maximum: 255}, uniqueness:{case_sensitive: false}#,format:{with: VALID_EMAIL_REGEX}
  has_secure_password
  validates :password, presence: true, length: {minimum: 6}, allow_nil: true

def self.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

# Remembers a user in the database for use in persistent sessions.
def remember
  self.remember_token = User.new_token
  update_attribute(:remember_digest, self.remember_token)
end

# Returns true if the given token matches the digest.
def authenticated?(remember_token)
  return false if remember_digest.nil?
  BCRYPT::PASSWORD.new(remember_digest).is_password?(remember_token)
end

# Forgets a user (cookies)
def forget
  update_attribute(:remember_digest, nil)
end

结束

【问题讨论】:

  • 我认为正确的语法是:BCrypt::Password.new..我真的不知道这是否重要......但我就是这样使用它的。
  • 并且您不需要文件开头的require 'bcrypt'
  • BCrypt::Password.new 仍然提供相同的错误,这很奇怪,因为 self.digest(string) 方法在创建 cookie 时有效

标签: ruby-on-rails ruby cookies bcrypt-ruby


【解决方案1】:

您的拼写有误。正确的格式应该是BCrypt

例如:

BCrypt::Password.create(string, cost: cost)

我希望这会有所帮助。

【讨论】:

  • 不起作用,但我认为这不是问题,因为 self.digest 在创建 cookie 时有效。
  • 你安装了gem install bcrypt-ruby的gem了吗?
  • 另外,您必须将其包含在您的 gem 文件中 gem "bcrypt-ruby", :require =&gt; "bcrypt"
猜你喜欢
  • 2015-12-29
  • 2019-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多