(Rails):NoMethodError:BCrypt :: Engine:Class的未定义方法成本

时间:2014-02-18 12:17:58

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

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

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

5 个答案:

答案 0 :(得分:15)

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

     gem 'bcrypt-ruby', '3.1.2'

然后从项目根目录运行捆绑更新捆绑安装

答案 1 :(得分:8)

当我看到“Ruby On Rails Tutorial”时,我遇到了同样的问题, 我通过设置Gemfile来解决它:

gem 'bcrypt-ruby', '3.0.1' 

为:

gem 'bcrypt-ruby', '3.1.2' 

然后运行:

bundle install

答案 2 :(得分:5)

同样去教程/书籍并遇到同样的问题,我使用了宝石'bcrypt-ruby','〜&gt; 3.0.0'因捆绑安装问题。经过secure_password.rb之后,问题出现在BCrypt :: Engine.cost中,这种方法实际上并不存在。

我将我的宝石改为宝石'bcrypt-ruby','〜&gt; 3.1.0'安装了bcrypt 3.1.7。看到有关重命名的宝石的警告信息,并将其更改为gem'bcrypt','〜&gt; 3.1.0'(这一部分无关紧要)。在进行捆绑安装之后,我能够通过我的IDE看到Bcrypt :: Engine.cost的实现,并且我能够在rails c中创建我的用户。

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

答案 3 :(得分:0)

我认为你正在学习本教程中的rails。如果您只是想继续并且没有花太多时间来做正确的修复,那么您只需使用费用10,而不是调用BCrypt::Engine.cost方法。

所以替换

cost = BCrypt::Engine.cost

cost = 10

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

答案 4 :(得分:0)

在mac上测试:

将此内容包含在您的gemfile中:

gem'bcrypt','3.1.11'

运行:

xcode-select --install

然后运行:bundle install

就是这样。

祝你好运