uninitialized constant Product

I am actually following the instructions/code snippets from "Agile Web
Development with Rails" and got as far as page 73 where I did ruby
script/generate controller Store index, then edited

store_controller.rb to
class StoreController < ApplicationController
  def index
    @products = Product.salable_items
  end
end

and product.rb to:
def self.salable_items
  find(:all,
       :conditions => "date_available <= now()",
       :order => "date_available desc")
end

but it keeps showing this error in http://localhost:3000/store/ :
NameError in StoreController#index

uninitialized constant Product

RAILS_ROOT: script/../config/..
Application Trace | Framework Trace | Full Trace

/usr/lib/ruby/gems/1.8/gems/activesupport-1.3.1/lib/active_support/dependencies.rb:100:in
`const_missing'
/usr/lib/ruby/gems/1.8/gems/activesupport-1.3.1/lib/active_support/dependencies.rb:131:in
`const_missing'
/usr/lib/ruby/gems/1.8/gems/activesupport-1.3.1/lib/active_support/dependencies.rb:133:in
`send'
/usr/lib/ruby/gems/1.8/gems/activesupport-1.3.1/lib/active_support/dependencies.rb:133:in
`const_missing'
app/controllers/store_controller.rb:3:in `index'

FWIW index.rhtml reads:
<table cellpadding="5" cellspacing="0">
<% for product in @products %>
  <tr valign="top">

    <td>
      <img src="<%= product.image_url %>"/>
    </td>

    <td width="450">
      <h3><%=h product.title %></h3>
      <small>
         <%= product.description %>
      </small>
      <br/>
      <strong>$<%= sprintf("%0.2f", product.price) %></strong>
      <%= link_to 'Add to Cart',
                  :action => 'add_to_cart',
                  :id => product %>
      <br/>
    </td>
  </tr>

  <tr><td colspan="2"><hr/></td></tr>

<% end %>
</table>

Solved! Use the foloowing product.rb instead:

class Product < ActiveRecord::Base

  validates_presence_of :title
  validates_presence_of :description
  validates_presence_of :image_url
  validates_uniqueness_of :title
  validates_numericality_of :price
  validates_format_of :image_url,
                            :with => %r{http:.+\.(gif|jpg|png)$}i,
                            :message => "must be a URL for a GIF, JPG,
or PNG image"

  # Return a list of products we can sell (which means they have to be
  # available). Show the most recently available first.
  def self.salable_items
    find(:all,
         :conditions => "date_available <= now()",
         :order => "date_available desc")
  end

  protected

  # Validate that the product price is a positive Float.
  def validate #:doc:
    errors.add(:price, "should be positive") unless price.nil? || price

= 0.01

  end

end

drat! I still get the error when using the so-called "solved" code. Is
there good code elsewhere?

Tom Coady wrote: