13

当我学习“Ruby on Rails 教程”时,我想在控制台上创建一个用户:

irb(main):001:0> User.create(name:"gsky",email:"k@q.com",
irb(main):002:1* password:"aaaaaa",password_confirmation:"aaaaaa")

然后,我收到以下错误消息:

NoMethodError: undefined method cost' for BCrypt::Engine:Class
from D:/RailsInstaller/Ruby2.0.0/lib/ruby/gems/2.0.0/gems/activemodel-4.
0.2/lib/active_model/secure_password.rb:104:inpassword='
from D:/RailsInstaller/Ruby2.0.0/lib/ruby/gems/2.0.0/gems/activerecord-4
.0.2/lib/active_record/attribute_assignment.rb:42:in public_send'

这是用户模型:

class User < ActiveRecord::Base

  before_save { self.email = email.downcase }

  validates :name,  presence: true, length: { maximum: 50 }

  VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i

  validates :email, presence: true,
                    format: { with: VALID_EMAIL_REGEX },
                    uniqueness: { case_sensitive: false }

   has_secure_password

   validates :password, length: { minimum: 6 }

end
4

5 回答 5

16

将 bcrypt-ruby 添加到您的 Gemfile 中,如下所示:

     gem 'bcrypt-ruby', '3.1.2'

然后从你的项目根目录运行bundle update和bundle install

于 2014-02-18T13:23:22.297 回答
8

当我看到“Ruby On Rails 教程”时,我遇到了同样的问题,我通过 set Gemfile 解决了这个问题:

gem 'bcrypt-ruby', '3.0.1' 

至:

gem 'bcrypt-ruby', '3.1.2' 

然后运行:

bundle install
于 2014-09-21T17:38:29.823 回答
5

由于捆绑安装的问题,我还使用了教程/书籍并遇到了同样的问题,我使用了 gem 'bcrypt-ruby', '~> 3.0.0'。经过secure_password.rb,问题出在BCrypt::Engine.cost,这个方法其实是不存在的。

我将 gem 更改为安装 bcrypt 3.1.7 的 gem 'bcrypt-ruby', '~> 3.1.0'。看到关于 gem 被重命名的警告消息并将其更改为 gem 'bcrypt', '~> 3.1.0' (这部分应该无关紧要)。完成捆绑安装后,我能够通过我的 IDE 看到 Bcrypt::Engine.cost 的实现,并且我能够在 rails c 中创建我的用户。

我想补充一点,如果我在测试环境中运行 rails c,在 test.rb 中添加 ActiveModel::SecurePassword.min_cost = true 可以让我创建新用户,但是当我在 development.rb 中添加相同的行时,它没有不工作。

于 2014-04-20T22:04:15.603 回答
0

我认为您正在从教程中学习 Rails。如果您只是想继续并且不花太多时间进行正确的修复,您可以只使用成本 10,而不是调用该BCrypt::Engine.cost 方法。

所以更换

cost = BCrypt::Engine.cost

cost = 10

使用此值时,计算时间不到 200 毫秒,应该没问题。

于 2014-10-31T22:48:26.007 回答
0

在mac上测试:

将其包含在您的 gemfile 中:

宝石'bcrypt','3.1.11'

跑:

xcode-选择--安装

然后运行:捆绑安装

而已。

祝你好运

于 2017-12-13T10:45:52.937 回答