Rails教程ch 7.2.3 has_password?未定义的方法

时间:2011-09-09 20:07:03

标签: ruby-on-rails

在Michael Hartl的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 个答案:

答案 0 :(得分:1)

确保此位在您的规范中,听起来像是缺少

before(:each) do
  @user = User.create!(@attr)
end