sinatra を使用して [Ryan Bates の「authenticaion from scratch」][1] を構築しようとしていますが、認証が機能しません。「undefined method password_hash」エラーが発生します。
他のすべてが機能しています。特に遅延読み込みについて、datamapper のドキュメントを確認しましたが、有用なものは見つかりませんでした。コードは以下です。私は何の間違いをしているのですか?
main.rb (該当部分のみ)
post "/login" do
  user = User.authenticate params[:email], params[:password]
  if user
    session[:user_id] = user.id
    redirect "/"
  else
    session[:errors] = "No such user or bad password."
    redirect "/login"
  end
end
user.rb
require 'data_mapper'
require 'dm-validations'
require 'bcrypt'
module Kimsin
  DataMapper.setup :default, 'sqlite3:///home/barerd/RProjects/kimsin/users.db' 
  class User 
    attr_accessor :password, :confirm_password
    include DataMapper::Resource
    property :id, Serial
    property :email, String, :required => true, :unique => true, :format => :email_address,
    :messages => { :presence => "We need your email address.", :is_unique => "We already have that email.", :format => "Doesn't look like an email adress.."}
    property :password_salt, String
    property :password_hash, String, :length => 80
    validates_presence_of :password, :confirm_password, :messages => { :presence => "You have to type a password and confirm it." }
    validates_format_of :password, :confirm_password, :with => /^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])([\x20-\x7E]){8,40}$/, :messages => { :format => "The password should be 8 to 40 characters long and contain at least one digit, one lowercase and one uppercase letter and one special character." }
    before :save, :encrypt_password
    def self.authenticate email, password
      user = User.all :email.like => email
      if user && user.password_hash == BCrypt::Engine.hash_secret(password, user.password_salt)
        user
      else
        nil
      end
    end
    def encrypt_password
      if password != nil
        self.password_salt = BCrypt::Engine.generate_salt
        self.password_hash = BCrypt::Engine.hash_secret password, password_salt
      end
    end
  end
  DataMapper.finalize
end