2014-02-18 2 views
12

Когда я узнаю„Рубин на Rails Tutorial“, и я хочу, чтобы создать пользователя на консоли:(Rails): NoMethodError не определено затратный метод»для Bcrypt :: Двигатель: Класс

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+\-.][email protected][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 
+0

что такое 'Пользователь'? это модель из проекта Ruby on Rails? post class 'User'. PS, если он не является чистым Ruby, добавьте тег 'Ruby On Rails' на вопрос – gotva

+0

Да, Пользователь - это имя модели. Я изменил тег с« Ruby »на« Ruby on Rails ». – gsky

+0

@ user3323364 Купите ли вы свою модель «Пользователь»? –

ответ

15

Добавить Bcrypt-рубин вашему Gemfile, как указано ниже:

 gem 'bcrypt-ruby', '3.1.2' 

затем запустить обновления расслоения из вашего проекта корневого каталога и пачки установить

+0

Да, "gem 'bcrypt-ruby', '3.1.2'" в моем Gemfile, но я получил сообщение об ошибке ... – gsky

+0

проверил вас user.rb в вашей папке модели, если у вас есть has_secure_password. если вы запустили rake db: migrate – osleonard

+0

Да, user.rb моей модели имеет has_secure_password, и я запустил rake db: migrate, а также throw: NoMethodError: undefined method 'cost 'для 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: в 'password = ' – gsky

5

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

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

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

+0

, когда у вас есть такие проблемы, вы должны запустить обновление пакета, которое будет обновляться ваши драгоценные камни, которые необходимо автоматически и во-вторых, удалить ActiveModel :: SecurePassword.min_cost = true из файла development.rb, поскольку он вам не нужен. – osleonard

+0

спасибо - это исправлено моя проблема – Subimage

+0

Стоит отметить, что тестовая среда Rails устанавливает SecurePassword.min_cost в true, поэтому вы не видите эту ошибку при тестировании. В основном это неправильное совпадение между ActiveModel и bcrypt-ruby, которое невозможно обнаружить в тестах из-за этого коммутатора. – toxaq

8

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

gem 'bcrypt-ruby', '3.0.1' 

к:

gem 'bcrypt-ruby', '3.1.2' 

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

bundle install 
0

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

Так заменить

cost = BCrypt::Engine.cost 

с

cost = 10 

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

0

Испытано на макинтош:

Включите это в Gemfile:

камень 'Bcrypt', «3,1.11'

пробег:

Xcode-выберите --install

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

Вот и все.

Лучшее из снимков

Смежные вопросы