Rails 3.1.1 дайджест has_secure_password не может быть пустым

#ruby-on-rails-3

#ruby-on-rails-3

Вопрос:

Я поиграл с has_secure_password и столкнулся с проблемой. Мой тест для действия создания в моем пользовательском контроллере не был работает передача. Итак, я начал играть в консоли и понял, что пароль не преобразуется в has и сохраняется в поле password_digest.

Когда я пытаюсь создать пользователя из консоли, происходит следующее.

 irb(main):031:0> u = User.new(:email => "test1@test.com", :password => "test", :password_confirmation => "test")
=> #<User id: nil, email: "test1@test.com", password_digest: nil, created_at: nil, updated_at: nil>
irb(main):032:0> u.save
=> false
irb(main):033:0> u.errors
=> #<ActiveModel::Errors:0x00000100cde500 @base=#<User id: nil, email: "test1@test.com", password_digest: nil, created_at: nil, updated_at: nil>, @messages={:password_digest=>["can't be blank"]}>
 

Я не уверен, что я делаю неправильно. Похоже, что атрибут password_digest никогда не присваивается. Если я создаю пользовательский объект без атрибутов и назначаю каждый атрибут по отдельности, я получаю ту же ошибку.

Вот моя модель

 class User < ActiveRecord::Base
  has_secure_password
  attr_accessible :email, :password, :password_confirmation
end
 

Заранее спасибо за помощь.

Алекс Шеной

Ответ №1:

У меня был тот же симптом, сообщение о том, что password_digest не может быть пустым. Проблема, с которой я столкнулся, заключалась в том, что я установил это в user.rb:

   attr_accessor :password
 

Это предотвратило вызов метода password= (см. secure_password.rb)

   # Encrypts the password into the password_digest attribute.
  def password=(unencrypted_password)
    @password = unencrypted_password
    unless unencrypted_password.blank?
      self.password_digest = BCrypt::Password.create(unencrypted_password)
    end
  end
 

и, таким образом, значение никогда не было установлено для password_digest .

Для меня исправление заключалось в удалении строки attr_accessor .

Ответ №2:

У меня была очень похожая проблема. Мой спас бы пользователя, но password_digest всегда nil был. Для меня это было потому, что у меня был следующий порядок кода в моей модели:

 attr_accessible :name, :password, :password_confirmation
has_secure_password
 

Я изменил его на:

 has_secure_password
attr_accessible :name, :password, :password_confirmation
 

Теперь он работает отлично.

Ответ №3:

Я привел простой пример и работал, как ожидалось. Возможно, в вашей конфигурации есть что-то, что мешает этому. Мой простой тест:

 $ rails new test
$ cd test
$ rails g model user name:string password_digest:string
$ rake db:migrate
$ vim app/model/user.rb
 

Добавить

 has_secure_password
attr_accessible :name, :password, :password_confirmation
 

сохранить и выйти

 $ rails c

Loading development environment (Rails 3.1.1)
ruby-1.9.2-p290 :001 > u = User.new(:name => "test1@test.com", :password => "test", :password_confirmation => "test")
=> #<User id: nil, name: "test1@test.com", password_digest: "$2a$10$08xY7p.8hq1.95ZQsx63ku05YfvVqSQ/CLiqUW5dtGhZ...", created_at: nil, updated_at: nil>
ruby-1.9.2-p290 :002 > u.save
Binary data inserted for `string` type on column `password_digest`
  SQL (51.4ms)  INSERT INTO "users" ("created_at", "name", "password_digest", "updated_at") VALUES (?, ?, ?, ?)  [["created_at", Sun, 23 Oct 2011 13:38:49 UTC  00:00], ["name", "test1@test.com"], ["password_digest", "$2a$10$08xY7p.8hq1.95ZQsx63ku05YfvVqSQ/CLiqUW5dtGhZSP9S7FtUy"], ["updated_at", Sun, 23 Oct 2011 13:38:49 UTC  00:00]]
=> true