(Rails): NoMethodError: неопределенная стоимость метода для BCrypt::Engine:Class

Когда я изучаю «Учебник по Ruby on Rails» и хочу создать пользователя на консоли:

irb(main):001:0> User.create(name:"gsky",email:"[email protected]",
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

person gsky    schedule 18.02.2014    source источник
comment
что такое User? это модель из проекта Ruby on Rails? почтовый класс User. PS, если это не чистый Ruby, добавьте к вопросу тег Ruby On Rails   -  person gotva    schedule 18.02.2014
comment
Да, User — это название модели. Я изменил тег с Ruby на Ruby on Rails.   -  person gsky    schedule 18.02.2014
comment
@ user3323364 Кэм, ты публикуешь свою User модель?   -  person Paul Richter    schedule 18.02.2014
comment
gem 'bcrypt-ruby', '3.1.2' в моем gemfile, и я использую систему Windows, railsinstaller-3.0.0.   -  person gsky    schedule 18.02.2014
comment
@ Teeg привет, я публикую свою модель пользователя, не могли бы вы сказать мне, что я могу сделать? Благодарю.   -  person gsky    schedule 18.02.2014


Ответы (5)


Добавьте bcrypt-ruby в свой Gemfile, как указано ниже:

     gem 'bcrypt-ruby', '3.1.2'

затем запустите обновление пакета из корневого каталога проекта и установите пакет.

person osleonard    schedule 18.02.2014
comment
Да, gem 'bcrypt-ruby', '3.1.2' в моем Gemfile, но я получил сообщение об ошибке... - person gsky; 18.02.2014
comment
проверьте свой user.rb в папке вашей модели, если у вас есть has_secure_password. если вы запустили rake db:migrate - person osleonard; 18.02.2014
comment
Да, user.rb моей модели имеет 'has_secure_password', и я запустил rake db:migrate, он также выдал: 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:in password=' - person gsky; 18.02.2014
comment
пожалуйста, подтвердите, что вы 1. запускаете bundle install 2. перезапускаете сервер/консоль после запуска пакета и миграции - person gotva; 18.02.2014
comment
добавьте ActiveModel::SecurePassword.min_cost = true в ваш test.rb по этому пути config/environments/test.rb, затем перезапустите сервер и проверьте, что должно работать - person osleonard; 18.02.2014
comment
о, я добавляю ActiveModel::SecurePassword.min_cost = true в мой test.rb в config/environments/test.rb, но не удалось, он также выдает: NoMethodError: неопределенная стоимость метода для BCrypt::Engine:Class из D: /RailsInstaller/Ruby2.0.0/lib/ruby/gems/2.0.0/gems/activemodel-4.0.2/lib/activ‌​e_model/secure_password.rb:104:in password=' - person gsky; 19.02.2014

Когда я увидел «Учебник по Ruby On Rails», я столкнулся с той же проблемой, я решил ее, установив Gemfile из:

gem 'bcrypt-ruby', '3.0.1' 

to:

gem 'bcrypt-ruby', '3.1.2' 

затем запустите:

bundle install
person qingxp9    schedule 21.09.2014

Также собираясь для учебника/книги и имея те же проблемы, я использовал gem 'bcrypt-ruby', '~> 3.0.0' из-за проблем с установкой пакета. После прохождения secure_password.rb проблема оказалась в BCrypt::Engine.cost, этого метода на самом деле не существует.

Я изменил свой драгоценный камень на драгоценный камень «bcrypt-ruby», «~> 3.1.0», который установил bcrypt 3.1.7. Увидел предупреждающее сообщение о переименовании гем и изменил его на гем «bcrypt», «~> 3.1.0» (эта часть не имеет значения). После установки пакета я смог увидеть реализацию Bcrypt::Engine.cost через свою IDE, и я смог сделать своего пользователя в rails c.

Я хочу добавить, что добавление ActiveModel::SecurePassword.min_cost = true в test.rb позволило мне создавать новых пользователей, если я запускал rails c в тестовой среде, но когда я добавил ту же строку в development.rb, это не помогло. т работать.

person Cliche818    schedule 20.04.2014
comment
когда у вас есть такие проблемы, вы должны запустить пакетное обновление, которое обновит ваши драгоценные камни, необходимые для автоматического и, во-вторых, удаления ActiveModel::SecurePassword.min_cost = true из вашего файла development.rb, поскольку он вам не нужен. - person osleonard; 06.05.2014
comment
Стоит отметить, что тестовая среда Rails устанавливает для SecurePassword.min_cost значение true, поэтому при тестировании вы видите эту ошибку. По сути, это несоответствие между ActiveModel и bcrypt-ruby, которое невозможно обнаружить в тестах из-за этого переключателя. - person toxaq; 03.03.2015

Я думаю, вы изучаете рельсы из учебника. Если вы просто хотите продолжить и не тратить много времени на правильное исправление, вы можете просто использовать стоимость, скажем, 10, вместо вызова метода BCrypt::Engine.cost.

Так что замените

cost = BCrypt::Engine.cost

с

cost = 10

Это значение при использовании займет менее 200 мс для вычисления, и это должно быть нормально.

person George Thomas    schedule 31.10.2014

Проверено на Mac:

Включите это в свой gemfile:

гем 'bcrypt', '3.1.11'

бежать:

xcode-выбрать --установить

затем запустите: установка пакета

Вот и все.

удачи

person Wilson    schedule 13.12.2017