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

8

「Ruby On Rails Tutorial」を見たとき、同じ問題に遭遇しました。次の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 を gem 'bcrypt-ruby', '~> 3.1.0' に変更し、bcrypt 3.1.7 をインストールしました。gem の名前が変更されているという警告メッセージを見て、それを gem 'bcrypt', '~> 3.1.0' に変更しました (この部分は重要ではありません)。バンドルのインストールを行った後、IDE を介して Bcrypt::Engine.cost の実装を確認でき、ユーザーを rails c にすることができました。

test.rb に ActiveModel::SecurePassword.min_cost = true を追加すると、テスト環境で rails c を実行した場合に新しいユーザーを作成できましたが、development.rb に同じ行を追加すると、作成できませんでした。動作しません。

于 2014-04-20T22:04:15.603 に答える
0

チュートリアルからレールを学んでいると思います。続行したいだけで、正しい修正に多くの時間を費やしたくない場合は、BCrypt::Engine.cost メソッドを呼び出す代わりに、コストを 10 として使用できます。

だから交換

cost = BCrypt::Engine.cost

cost = 10

この値を使用すると、計算に 200 ミリ秒もかからず、問題ありません。

于 2014-10-31T22:48:26.007 に答える