Rails Tutorial ch 7.2.3 has_password?неопределенный метод - PullRequest
0 голосов
/ 10 сентября 2011

В учебнике Майкла Хартла по Ruby on Rails, ch 7.2.3 , rspec возвращает следующие ошибки:

Failures:

1) User has_password? method should be true if the passwords match
 Failure/Error: @user.has_password?(@attr[:password].should be_true)
 NoMethodError:
   undefined method `has_password?' for nil:NilClass
 # ./spec/models/user_spec.rb:132:in `block (3 levels) in <top (required)>'

2) User has_password? method should be false if the passwords don't match
 Failure/Error: @user.has_password?("invalid").should be_false
 NoMethodError:
   undefined method `has_password?' for nil:NilClass
 # ./spec/models/user_spec.rb:136:in `block (3 levels) in <top (required)>'

Finished in 0.23931 seconds
18 examples, 2 failures

Failed examples:

rspec ./spec/models/user_spec.rb:131 # User has_password? method should be true if the  passwords match
rspec ./spec/models/user_spec.rb:135 # User has_password? method should be false if the passwords don't match

В консоли я также получаю неопределенную локальную переменнуюошибка при «подтверждении пароля»

Я тщательно проверил свой код и не могу найти несоответствие, но, очевидно, я делаю это неправильно.

вот модель моего пользователя:

require 'digest'

class User < ActiveRecord::Base
  attr_accessor :password
  attr_accessible :name, :email, :password, :password_confirmation

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

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

  # Automatically create the virtual attribute 'password_confirmation'.
  validates :password, :presence     => true,
                   :confirmation => true,
                   :length       => { :within => 6..40 }

  before_save :encrypt_password

    def has_password?(submitted_password)
      self.encrypted_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

1 Ответ

1 голос
/ 10 сентября 2011

Убедитесь, что этот бит в вашей спецификации, звучит так, как будто он отсутствует

before(:each) do
  @user = User.create!(@attr)
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...