Проблема с has_password? метод на railstutorial.org (Глава 7)

У меня точно такая же проблема, описанная в этот вопрос, но, видимо, по другой причине.

Это соответствующий раздел книги. .

Насколько я могу судить, я сделал это точно так же, как в книге, и все мои тесты rspec работают нормально.

Код моей модели пользователя таков:

require 'digest' #Needs digest to do password encryption


class User < ActiveRecord::Base

  attr_accessor :password
  attr_accessible :name, :email, :password, :password_confirmation
  validates :name, :presence => true,
            :length => { :maximum => 20 }

  email_regex = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i

  validates :email, :presence => true,
                    :format => { :with => email_regex },
                    :uniqueness => { :case_sensitive => false }

  validates :password, :presence => true,
                       :confirmation =>true,
                       :length => { :within => 5..24 }

  before_save :encrypt_password

  def has_password?(submitted_password)
    encrypt_password == encrypt(submitted_password)
  end




  private

  def encrypt_password
     self.salt = make_salt if new_record?
     self.encrypted_password = encrypt(password)
   end

   def encrypt(string)
     secure_hash("#{salt}--#{string}")
   end

   def make_salt
     secure_hash("#{Time.now.utc}--#{password}")
   end

   def secure_hash(string)
     Digest::SHA2.hexdigest(string)
   end


end

Как я уже сказал, тесты работают нормально, но has_password? всегда возвращает false в консоли. Вот что я сделал в консоли:

ruby-1.9.2-p180 :002 > User.create!(:name => 'userdude', :email => '[email protected]', :password => 'foobar', :password_confirmation => 'foobar' )

=> #<User id: 2, name: "userdude", email: "[email protected]", created_at: "2011-07-28 23:13:40", updated_at: "2011-07-28 23:13:40", encrypted_password: "84f9a1348af1f7e6610fb1d0c7002efe96f43dc97d807b3ac00...", salt: "13cf7bfd386af4fcf282ae5fa4831eb9d1dff15e842be8cba88..."> 

ruby-1.9.2-p180 :003 > User.all
 => [#<User id: 2, name: "userdude", email: "[email protected]", created_at: "2011-07-28 23:13:40", updated_at: "2011-07-28 23:13:40", encrypted_password: "84f9a1348af1f7e6610fb1d0c7002efe96f43dc97d807b3ac00...", salt: "13cf7bfd386af4fcf282ae5fa4831eb9d1dff15e842be8cba88...">] 

ruby-1.9.2-p180 :004 > user = User.first
 => #<User id: 2, name: "userdude", email: "[email protected]", created_at: "2011-07-28 23:13:40", updated_at: "2011-07-28 23:13:40", encrypted_password: "84f9a1348af1f7e6610fb1d0c7002efe96f43dc97d807b3ac00...", salt: "13cf7bfd386af4fcf282ae5fa4831eb9d1dff15e842be8cba88..."> 

ruby-1.9.2-p180 :005 > user
 => #<User id: 2, name: "userdude", email: "[email protected]", created_at: "2011-07-28 23:13:40", updated_at: "2011-07-28 23:13:40", encrypted_password: "84f9a1348af1f7e6610fb1d0c7002efe96f43dc97d807b3ac00...", salt: "13cf7bfd386af4fcf282ae5fa4831eb9d1dff15e842be8cba88..."> 

ruby-1.9.2-p180 :006 > user.has_password?('foobar')
 => false 
ruby-1.9.2-p180 :007 >

Как видите, нет уже созданных записей, как в другом вопросе, который я связал.


person agente_secreto    schedule 28.07.2011    source источник


Ответы (1)


похоже вы случайно перепутали encrypt_password и encrypted_password

попробуйте изменить свой метод has_password? на это:

  def has_password?(submitted_password)
    self.encrypted_password == encrypt(submitted_password)
  end

Проблема заключалась в том, что вы использовали encrypt_password, поэтому, если вы ищете запись, атрибут простого пароля password равен нулю, поэтому ваш метод encrypt_password делает self.encrypted_password = encrypt(nil)

person sled    schedule 28.07.2011
comment
ДА! Спасибо! Я сходил с ума. Теперь, когда я прочитал это более внимательно, я увидел это: я неправильно написал зашифрованный_пароль, вероятно, это было автозаполнение редактора. - person agente_secreto; 29.07.2011
comment
Блин конечно тесты прошли успешно... я бы никогда не нашел ошибку - person agente_secreto; 29.07.2011