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: