The Depot Application 
    Table of Contents 
    
    Development Log 
    ruby /home/rubys/git/rails/railties/bin/rails -v 
    Rails 2.3.2 
    ruby -v 
    ruby 1.8.7 (2008-08-11 patchlevel 72) [i486-linux] 
    gem -v 
    1.3.3 
    
      4 Instant Gratification 
     
    erb -r rubygems -r active_support -T - < /home/rubys/git/awdwr/data/code/erb/ex1.html.erb |  
       sed 's/<!--.*-->//' 
    <ul> 
      <li>Addition: 3 </li> 
      <li>Concatenation: cowboy </li> 
      <li>Time in one hour:  Mon May 18 09:32:21 -0400 2009 </li> 
    </ul> 
    erb -r rubygems -r active_support -T - < /home/rubys/git/awdwr/data/code/erb/ex2.html.erb | 
       sed 's/<!--.*-->//' 
      
    Ho!<br /> 
      
    Ho!<br /> 
      
    Ho!<br /> 
      
    Merry Christmas! 
    erb -r rubygems -r active_support -T - < /home/rubys/git/awdwr/data/code/erb/ex2a.html.erb | 
       sed 's/<!--.*-->//' 
    Ho!<br /> 
    Ho!<br /> 
    Ho!<br /> 
      
    Merry Christmas! 
    sed 's/-%>\n/%>/' < /home/rubys/git/awdwr/data/code/erb/ex2b.html.erb |  
       erb -r rubygems -r active_support -T - |
       sed 's/<!--.*-->//' 
    Ho!<br /> 
    Ho!<br /> 
    Ho!<br /> 
    Merry Christmas! 
    
      6.1 Iteration A1: Getting Something Running 
     
    ruby /home/rubys/git/rails/railties/bin/rails depot 
          create   
          create  app/controllers 
          create  app/helpers 
          create  app/models 
          create  app/views/layouts 
          create  config/environments 
          create  config/initializers 
          create  config/locales 
          create  db 
          create  doc 
          create  lib 
          create  lib/tasks 
          create  log 
          create  public/images 
          create  public/javascripts 
          create  public/stylesheets 
          create  script/performance 
          create  test/fixtures 
          create  test/functional 
          create  test/integration 
          create  test/performance 
          create  test/unit 
          create  vendor 
          create  vendor/plugins 
          create  tmp/sessions 
          create  tmp/sockets 
          create  tmp/cache 
          create  tmp/pids 
          create  Rakefile 
          create  README 
          create  app/controllers/application_controller.rb 
          create  app/helpers/application_helper.rb 
          create  config/database.yml 
          create  config/routes.rb 
          create  config/locales/en.yml 
          create  db/seeds.rb 
          create  config/initializers/backtrace_silencers.rb 
          create  config/initializers/inflections.rb 
          create  config/initializers/mime_types.rb 
          create  config/initializers/new_rails_defaults.rb 
          create  config/initializers/session_store.rb 
          create  config/environment.rb 
          create  config/boot.rb 
          create  config/environments/production.rb 
          create  config/environments/development.rb 
          create  config/environments/test.rb 
          create  script/about 
          create  script/console 
          create  script/dbconsole 
          create  script/destroy 
          create  script/generate 
          create  script/runner 
          create  script/server 
          create  script/plugin 
          create  script/performance/benchmarker 
          create  script/performance/profiler 
          create  test/test_helper.rb 
          create  test/performance/browsing_test.rb 
          create  public/404.html 
          create  public/422.html 
          create  public/500.html 
          create  public/index.html 
          create  public/favicon.ico 
          create  public/robots.txt 
          create  public/images/rails.png 
          create  public/javascripts/prototype.js 
          create  public/javascripts/effects.js 
          create  public/javascripts/dragdrop.js 
          create  public/javascripts/controls.js 
          create  public/javascripts/application.js 
          create  doc/README_FOR_APP 
          create  log/server.log 
          create  log/production.log 
          create  log/development.log 
          create  log/test.log 
    ln -s /home/rubys/git/rails vendor/rails 
    edit config/environments/development.rb 
    # Settings specified here will take precedence over those in config/environment.rb 
      
    # In the development environment your application's code is reloaded on 
    # every request.  This slows down response time but is perfect for development 
    # since you don't have to restart the webserver when you make code changes. 
    config.cache_classes = false 
      
    # Log error messages when you accidentally call methods on nil. 
    config.whiny_nils = true 
      
    # Show full error reports and disable caching 
    config.action_controller.consider_all_requests_local = true 
    config.action_view.debug_rjs                         = true 
    config.action_controller.perform_caching             = false 
      
    # Don't care if the mailer can't send 
    config.action_mailer.raise_delivery_errors = false 
      
    config.logger = Logger.new(config.log_path, 2, 10.kilobytes) 
    
      6.2 Creating the Products Model and Maintenance Application 
     
    ls -p 
    app/ 
    config/ 
    db/ 
    doc/ 
    lib/ 
    log/ 
    public/ 
    Rakefile 
    README 
    script/ 
    test/ 
    tmp/ 
    vendor/ 
    ruby script/generate scaffold product title:string description:text image_url:string 
          exists  app/models/ 
          exists  app/controllers/ 
          exists  app/helpers/ 
          create  app/views/products 
          exists  app/views/layouts/ 
          exists  test/functional/ 
          exists  test/unit/ 
          create  test/unit/helpers/ 
          exists  public/stylesheets/ 
          create  app/views/products/index.html.erb 
          create  app/views/products/show.html.erb 
          create  app/views/products/new.html.erb 
          create  app/views/products/edit.html.erb 
          create  app/views/layouts/products.html.erb 
          create  public/stylesheets/scaffold.css 
          create  app/controllers/products_controller.rb 
          create  test/functional/products_controller_test.rb 
          create  app/helpers/products_helper.rb 
          create  test/unit/helpers/products_helper_test.rb 
           route  map.resources :products 
      dependency  model 
          exists    app/models/ 
          exists    test/unit/ 
          exists    test/fixtures/ 
          create    app/models/product.rb 
          create    test/unit/product_test.rb 
          create    test/fixtures/products.yml 
          create    db/migrate 
          create    db/migrate/20090518123224_create_products.rb 
    rake db:migrate 
    mv 20090518123224_create_products.rb 20080601000001_create_products.rb 
    (in /home/rubys/git/awdwr/work/depot) 
    ==  CreateProducts: migrating ================================================= 
    -- create_table(:products) 
       -> 0.0018s 
    ==  CreateProducts: migrated (0.0019s) ======================================== 
      
    sqlite3> select version from schema_migrations 
    version = 20080601000001 
    restart 
    edit app/views/products/new.html.erb 
    <h1>New product</h1> 
      
    <% form_for(@product) do |f| %> 
      <%= f.error_messages %> 
      
      <p> 
        <%= f.label :title %><br /> 
        <%= f.text_field :title %> 
      </p> 
      <p> 
        <%= f.label :description %><br /> 
        <%= f.text_area :description, :rows => 6 %> 
      </p> 
      <p> 
        <%= f.label :image_url %><br /> 
        <%= f.text_field :image_url %> 
      </p> 
      <p> 
        <%= f.submit 'Create' %> 
      </p> 
    <% end %> 
      
    <%= link_to 'Back', products_path %> 
    get /products 
    
 
Listing products 
  
    Title 
    Description 
    Image url 
   
New product 
     
    
    get /products/new 
    
    
    post /products 
    
      product[image_url] => /images/svn.jpg 
      product[description] => <p>
This book is a recipe-based approach to
using Subversion that will get you up
and running quickly---and correctly. All
projects need version control: it's a
foundational piece of any project's
infrastructure. Yet half of all project
teams in the U.S.  dont use any version
control at all. Many others dont use it
well, and end up experiencing
time-consuming problems.
</p>
 
      product[title] => Pragmatic Version Control 
     
    
You are being 
redirected .    
 
    
    get http://127.0.0.1:3000/products/1 
    
 
  Title: 
  Pragmatic Version Control
  Description: 
  <p>
This book is a recipe-based approach to
using Subversion that will get you up
and running quickly---and correctly. All
projects need version control: it's a
foundational piece of any project's
infrastructure. Yet half of all project
teams in the U.S.  dont use any version
control at all. Many others dont use it
well, and end up experiencing
time-consuming problems.
</p>
  Image url: 
  /images/svn.jpg
Edit  |
Back 
     
    
    get /products 
    
 
Listing products 
  
    Title 
    Description 
    Image url 
   
  
    Pragmatic Version Control 
    <p>
This book is a recipe-based approach to
using Subversion that will get you up
and running quickly---and correctly. All
projects need version control: it's a
foundational piece of any project's
infrastructure. Yet half of all project
teams in the U.S.  dont use any version
control at all. Many others dont use it
well, and end up experiencing
time-consuming problems.
</p>
 
    /images/svn.jpg 
    Show  
    Edit  
    Destroy  
   
New product 
     
    
    sqlite3 db/development.sqlite3 .schema 
    CREATE TABLE "products" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "title" varchar(255), "description" text, "image_url" varchar(255), "created_at" datetime, "updated_at" datetime); 
    CREATE TABLE "schema_migrations" ("version" varchar(255) NOT NULL); 
    CREATE UNIQUE INDEX "unique_schema_migrations" ON "schema_migrations" ("version"); 
    rake test 
    /usr/bin/ruby1.8 -I"lib:test" "/usr/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake/rake_test_loader.rb" "test/unit/product_test.rb" "test/unit/helpers/products_helper_test.rb"  
    (in /home/rubys/git/awdwr/work/depot) 
    Loaded suite /usr/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake/rake_test_loader 
    Started 
    . 
    Finished in 0.030325 seconds. 
      
    1 tests, 1 assertions, 0 failures, 0 errors 
    /usr/bin/ruby1.8 -I"lib:test" "/usr/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake/rake_test_loader.rb" "test/functional/products_controller_test.rb"  
    Loaded suite /usr/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake/rake_test_loader 
    Started 
    ....... 
    Finished in 0.111042 seconds. 
      
    7 tests, 10 assertions, 0 failures, 0 errors 
    /usr/bin/ruby1.8 -I"lib:test" "/usr/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake/rake_test_loader.rb"   
    
      6.3 Iteration A2: Add a Missing Column 
     
    ruby script/generate migration add_price_to_product price:decimal 
          exists  db/migrate 
          create  db/migrate/20090518123239_add_price_to_product.rb 
    cat db/migrate/20090518123239_add_price_to_product.rb 
    class AddPriceToProduct < ActiveRecord::Migration 
      def self.up 
        add_column :products, :price, :decimal 
      end 
      
      def self.down 
        remove_column :products, :price 
      end 
    end 
    edit db/migrate/20090518123239_add_price_to_product.rb 
    class AddPriceToProduct < ActiveRecord::Migration 
      def self.up 
        add_column :products, :price, :decimal, 
          :precision => 8, :scale => 2, :default => 0 
      end 
      
      def self.down 
        remove_column :products, :price 
      end 
    end 
    rake db:migrate 
    mv 20090518123239_add_price_to_product.rb 20080601000002_add_price_to_product.rb 
    (in /home/rubys/git/awdwr/work/depot) 
    ==  AddPriceToProduct: migrating ============================================== 
    -- add_column(:products, :price, :decimal, {:precision=>8, :default=>0, :scale=>2}) 
       -> 0.0009s 
    ==  AddPriceToProduct: migrated (0.0010s) ===================================== 
      
    sqlite3 db/development.sqlite3 .schema 
    CREATE TABLE "products" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "title" varchar(255), "description" text, "image_url" varchar(255), "created_at" datetime, "updated_at" datetime, "price" decimal(8,2) DEFAULT 0); 
    CREATE TABLE "schema_migrations" ("version" varchar(255) NOT NULL); 
    CREATE UNIQUE INDEX "unique_schema_migrations" ON "schema_migrations" ("version"); 
    edit app/views/products/index.html.erb 
    <h1>Listing products</h1> 
      
    <table> 
      <tr> 
        <th>Title</th> 
        <th>Description</th> 
        <th>Image url</th> 
        <th>Price</th> 
      </tr> 
      
    <% @products.each do |product| %> 
      <tr> 
        <td><%=h product.title %></td> 
        <td><%=h product.description %></td> 
        <td><%=h product.image_url %></td> 
        <td><%=h product.price %></td> 
        <td><%= link_to 'Show', product %></td> 
        <td><%= link_to 'Edit', edit_product_path(product) %></td> 
        <td><%= link_to 'Destroy', product, :confirm => 'Are you sure?', 
                                            :method => :delete %></td> 
      </tr> 
    <% end %> 
    </table> 
      
    <br /> 
      
    <%= link_to 'New product', new_product_path %> 
    edit app/views/products/new.html.erb 
    <h1>New product</h1> 
      
    <% form_for(@product) do |f| %> 
      <%= f.error_messages %> 
      
      <p> 
        <%= f.label :title %><br /> 
        <%= f.text_field :title %> 
      </p> 
      <p> 
        <%= f.label :description %><br /> 
        <%= f.text_area :description, :rows => 6 %> 
      </p> 
      <p> 
        <%= f.label :image_url %><br /> 
        <%= f.text_field :image_url %> 
      </p> 
      <p> 
        <%= f.label :price %><br /> 
        <%= f.text_field :price %> 
      </p> 
      
      <p> 
        <%= f.submit 'Create' %> 
      </p> 
    <% end %> 
      
    <%= link_to 'Back', products_path %> 
    edit app/views/products/edit.html.erb 
    <h1>Editing product</h1> 
      
    <% form_for(@product) do |f| %> 
      <%= f.error_messages %> 
      
      <p> 
        <%= f.label :title %><br /> 
        <%= f.text_field :title %> 
      </p> 
      <p> 
        <%= f.label :description %><br /> 
        <%= f.text_area :description %> 
      </p> 
      <p> 
        <%= f.label :image_url %><br /> 
        <%= f.text_field :image_url %> 
      </p> 
      <p> 
        <%= f.label :price %><br /> 
        <%= f.text_field :price %> 
      </p> 
      
      <p> 
        <%= f.submit 'Update' %> 
      </p> 
    <% end %> 
      
    <%= link_to 'Show', @product %> | 
    <%= link_to 'Back', products_path %> 
    edit app/views/products/show.html.erb 
    <p> 
      <b>Title:</b> 
      <%=h @product.title %> 
    </p> 
      
    <p> 
      <b>Description:</b> 
      <%=h @product.description %> 
    </p> 
      
    <p> 
      <b>Image url:</b> 
      <%=h @product.image_url %> 
    </p> 
      
    <p> 
      <b>Price:</b> 
      <%=h @product.price %> 
    </p> 
      
    <%= link_to 'Edit', edit_product_path(@product) %> | 
    <%= link_to 'Back', products_path %> 
    get /products 
    
 
Listing products 
  
    Title 
    Description 
    Image url 
    
    Price 
    
   
  
    Pragmatic Version Control 
    <p>
This book is a recipe-based approach to
using Subversion that will get you up
and running quickly---and correctly. All
projects need version control: it's a
foundational piece of any project's
infrastructure. Yet half of all project
teams in the U.S.  dont use any version
control at all. Many others dont use it
well, and end up experiencing
time-consuming problems.
</p>
 
    /images/svn.jpg 
    
    0.0 
    
    Show  
    Edit  
    Destroy  
   
New product 
     
    
    get /products/1 
    
 
  Title: 
  Pragmatic Version Control
  Description: 
  <p>
This book is a recipe-based approach to
using Subversion that will get you up
and running quickly---and correctly. All
projects need version control: it's a
foundational piece of any project's
infrastructure. Yet half of all project
teams in the U.S.  dont use any version
control at all. Many others dont use it
well, and end up experiencing
time-consuming problems.
</p>
  Image url: 
  /images/svn.jpg
  Price: 
  0.0
Edit  |
Back 
     
    
    get /products/new 
    
    
    rake test 
    /usr/bin/ruby1.8 -I"lib:test" "/usr/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake/rake_test_loader.rb" "test/unit/product_test.rb" "test/unit/helpers/products_helper_test.rb"  
    (in /home/rubys/git/awdwr/work/depot) 
    Loaded suite /usr/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake/rake_test_loader 
    Started 
    . 
    Finished in 0.032714 seconds. 
      
    1 tests, 1 assertions, 0 failures, 0 errors 
    /usr/bin/ruby1.8 -I"lib:test" "/usr/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake/rake_test_loader.rb" "test/functional/products_controller_test.rb"  
    Loaded suite /usr/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake/rake_test_loader 
    Started 
    ....... 
    Finished in 0.113203 seconds. 
      
    7 tests, 10 assertions, 0 failures, 0 errors 
    /usr/bin/ruby1.8 -I"lib:test" "/usr/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake/rake_test_loader.rb"   
    edit app/views/products/show.html.erb 
    <p> 
      <b>Title:</b> 
      <%=h @product.title %> 
    </p> 
      
    <p> 
      <b>Description:</b> 
      <%= @product.description %> 
    </p> 
      
    <p> 
      <b>Image url:</b> 
      <%=h @product.image_url %> 
    </p> 
      
    <p> 
      <b>Price:</b> 
      <%=h @product.price %> 
    </p> 
      
    <%= link_to 'Edit', edit_product_path(@product) %> | 
    <%= link_to 'Back', products_path %> 
    get /products/1 
    
 
  Title: 
  Pragmatic Version Control
  Description: 
  
This book is a recipe-based approach to
using Subversion that will get you up
and running quickly---and correctly. All
projects need version control: it's a
foundational piece of any project's
infrastructure. Yet half of all project
teams in the U.S.  dont use any version
control at all. Many others dont use it
well, and end up experiencing
time-consuming problems.
  Image url: 
  /images/svn.jpg
  Price: 
  0.0
Edit  |
Back 
     
    
    
      6.4 Iteration A3: Validate! 
     
    edit app/models/product.rb 
    class Product < ActiveRecord::Base 
      validates_presence_of :title, :description, :image_url 
      validates_numericality_of :price 
      validate :price_must_be_at_least_a_cent 
      validates_uniqueness_of :title 
      validates_format_of :image_url, :allow_blank => true, 
                          :with    => %r{\.(gif|jpg|png)$}i, 
                          :message => 'must be a URL for GIF, JPG ' + 
                                      'or PNG image.' 
     
    protected 
      def price_must_be_at_least_a_cent 
        errors.add(:price, 'should be at least 0.01') if price.nil? || 
                           price < 0.00 
      end 
     
    end 
    get /products/new 
    
    
    post /products 
    
    
 
New product 
  3 errors prohibited this product from being saved There were problems with the following fields:
Image url can't be blank Title can't be blank Description can't be blank  
  
    
Title 
 
    
  
  
    
Description 
 
    
  
  
    
Image url 
 
    
  
  
  
    Price  
     
  
  
  
     
  
 
Back 
     
    
    get /products/new 
    
    
    post /products 
    
      product[image_url] => /images/utj.jpg 
      product[price] => wibble 
      product[description] => A true masterwork.  Comparable to Kafka at
his funniest, or Marx during his slapstick
period.  Move over, Tolstoy, there's a new
funster in town.
 
      product[title] => Pragmatic Unit Testing 
     
    
    
    edit app/models/product.rb 
    class Product < ActiveRecord::Base 
      validates_presence_of :title, :description, :image_url 
      validates_numericality_of :price 
      validate :price_must_be_at_least_a_cent 
      validates_uniqueness_of :title 
      validates_format_of :image_url, 
                          :with    => %r{\.(gif|jpg|png)$}i, 
                          :message => 'must be a URL for GIF, JPG ' + 
                                      'or PNG image.' 
      
    protected 
      def price_must_be_at_least_a_cent 
        errors.add(:price, 'should be at least 0.01') if price.nil? || 
                           price < 0.01 
      end 
      
    end 
    edit app/views/layouts/products.html.erb 
    
      6.5 Iteration A4: Making Prettier Listings 
     
    edit db/migrate/003_add_test_data.rb 
    class AddTestData < ActiveRecord::Migration 
      def self.up 
        Product.delete_all 
        Product.create(:title => 'Pragmatic Version Control', 
          :description => 
          %{<p> 
             This book is a recipe-based approach to using Subversion that will  
             get you up and running quickly---and correctly. All projects need 
             version control: it's a foundational piece of any project's  
             infrastructure. Yet half of all project teams in the U.S. don't use 
             any version control at all. Many others don't use it well, and end  
             up experiencing time-consuming problems. 
          </p>}, 
        :image_url => '/images/svn.jpg', 
        :price => 28.50) 
        # . . . 
      end 
     
      def self.down 
        Product.delete_all 
      end 
    end 
    rake db:migrate 
    mv 003_add_test_data.rb 20080601000003_add_test_data.rb 
    (in /home/rubys/git/awdwr/work/depot) 
    ==  AddTestData: migrating ==================================================== 
    ==  AddTestData: migrated (0.0159s) =========================================== 
      
    edit app/views/layouts/products.html.erb 
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
           "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
      
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> 
    <head> 
      <meta http-equiv="content-type" content="text/html;charset=UTF-8" /> 
      <title>Products: <%= controller.action_name %></title> 
      <%= stylesheet_link_tag 'scaffold', 'depot' %> 
    </head> 
    edit app/views/products/index.html.erb 
    <div id="product-list"> 
      <h1>Listing products</h1> 
      
      <table> 
      <% for product in @products %> 
        <tr class="<%= cycle('list-line-odd', 'list-line-even') %>"> 
      
          <td> 
            <%= image_tag product.image_url, :class => 'list-image' %> 
          </td> 
      
          <td class="list-description"> 
            <dl> 
              <dt><%=h product.title %></dt> 
              <dd><%=h truncate(product.description.gsub(/<.*?>/,''), 
                     :length => 80) %></dd> 
            </dl> 
          </td> 
      
          <td class="list-actions"> 
            <%= link_to 'Show', product %><br/> 
            <%= link_to 'Edit', edit_product_path(product) %><br/> 
            <%= link_to 'Destroy', product,  
                        :confirm => 'Are you sure?', 
                        :method => :delete %> 
          </td> 
        </tr> 
      <% end %> 
      </table> 
    </div> 
      
    <br /> 
      
    <%= link_to 'New product', new_product_path %> 
    cp -v /home/rubys/git/awdwr/data/images/* public/images/ 
    `/home/rubys/git/awdwr/data/images/auto.jpg' -> `public/images/auto.jpg' 
    `/home/rubys/git/awdwr/data/images/logo.png' -> `public/images/logo.png' 
    `/home/rubys/git/awdwr/data/images/rails.png' -> `public/images/rails.png' 
    `/home/rubys/git/awdwr/data/images/svn.jpg' -> `public/images/svn.jpg' 
    `/home/rubys/git/awdwr/data/images/utc.jpg' -> `public/images/utc.jpg' 
    cp -v /home/rubys/git/awdwr/data/depot.css public/stylesheets 
    `/home/rubys/git/awdwr/data/depot.css' -> `public/stylesheets/depot.css' 
    get /products 
    
    
    
      7.1 Iteration B1: Create the Catalog Listing 
     
    ruby script/generate controller store index 
          exists  app/controllers/ 
          exists  app/helpers/ 
          create  app/views/store 
          exists  test/functional/ 
          exists  test/unit/helpers/ 
          create  app/controllers/store_controller.rb 
          create  test/functional/store_controller_test.rb 
          create  app/helpers/store_helper.rb 
          create  test/unit/helpers/store_helper_test.rb 
          create  app/views/store/index.html.erb 
    restart 
    get /store 
    
Store#index 
Find me in app/views/store/index.html.erb
     
    
    edit app/controllers/store_controller.rb 
    class StoreController < ApplicationController 
      def index 
        @products = Product.find_products_for_sale 
      end 
      
    end 
    edit app/models/product.rb 
    class Product < ActiveRecord::Base 
      
      def self.find_products_for_sale 
        find(:all, :order => "title") 
      end 
      
      # validation stuff... 
      
      
      validates_presence_of :title, :description, :image_url 
      validates_numericality_of :price 
      validate :price_must_be_at_least_a_cent 
      validates_uniqueness_of :title 
      validates_format_of :image_url, 
                          :with    => %r{\.(gif|jpg|png)$}i, 
                          :message => 'must be a URL for GIF, JPG ' + 
                                      'or PNG image.' 
      
    protected 
      def price_must_be_at_least_a_cent 
        errors.add(:price, 'should be at least 0.01') if price.nil? || 
                           price < 0.01 
      end 
      
    end 
    edit app/views/store/index.html.erb 
    <h1>Your Pragmatic Catalog</h1> 
     
    <% for product in @products -%> 
      <div class="entry"> 
        <%= image_tag(product.image_url) %> 
        <h3><%=h product.title %></h3> 
        <%= product.description %> 
        <div class="price-line"> 
        <span class="price"><%= product.price %></span> 
        </div> 
      </div> 
    <% end %> 
    get /store 
    
Your Pragmatic Catalog 
  
     
    Pragmatic Project Automation 
    
       Pragmatic Project Automation  shows you how to improve the 
       consistency and repeatability of your project's procedures using 
       automation to reduce risk and errors.
      
      
        Simply put, we're going to put this thing called a computer to work 
        for you doing the mundane (but important) project stuff. That means 
        you'll have more time and energy to do the really 
        exciting---and difficult---stuff, like writing quality code.
      
    
    29.95 
    
   
  
     
    Pragmatic Unit Testing (C#) 
    
        Pragmatic programmers use feedback to drive their development and 
        personal processes. The most valuable feedback you can get while 
        coding comes from unit testing.
      
      
        Without good tests in place, coding can become a frustrating game of 
        "whack-a-mole." That's the carnival game where the player strikes at a 
        mechanical mole; it retreats and another mole pops up on the opposite side 
        of the field. The moles pop up and down so fast that you end up flailing 
        your mallet helplessly as the moles continue to pop up where you least 
        expect them.
      
    
    27.75 
    
   
  
     
    Pragmatic Version Control 
    
         This book is a recipe-based approach to using Subversion that will 
         get you up and running quickly---and correctly. All projects need
         version control: it's a foundational piece of any project's 
         infrastructure. Yet half of all project teams in the U.S. don't use
         any version control at all. Many others don't use it well, and end 
         up experiencing time-consuming problems.
      
    
    28.5 
    
   
     
    
    
      7.2 Iteration B2: Add a Page Layout 
     
    edit app/views/layouts/store.html.erb 
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
                          "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
    <html> 
    <head> 
      <title>Pragprog Books Online Store</title> 
      <%= stylesheet_link_tag "depot", :media => "all" %><!-- <label id="code.slt"/> --> 
    </head> 
    <body id="store"> 
      <div id="banner"> 
        <%= image_tag("logo.png") %> 
        <%= @page_title || "Pragmatic Bookshelf" %><!-- <label id="code.depot.e.title"/> --> 
      </div> 
      <div id="columns"> 
        <div id="side"> 
          <a href="http://www....">Home</a><br /> 
          <a href="http://www..../faq">Questions</a><br /> 
          <a href="http://www..../news">News</a><br /> 
          <a href="http://www..../contact">Contact</a><br /> 
        </div> 
        <div id="main"> 
          <%= yield :layout %><!-- <label id="code.depot.e.include"/> --> 
        </div> 
      </div> 
    </body> 
    </html> 
    edit public/stylesheets/depot.css 
    /* Styles for main page */ 
      
    #banner { 
      background: #9c9; 
      padding-top: 10px; 
      padding-bottom: 10px; 
      border-bottom: 2px solid; 
      font: small-caps 40px/40px "Times New Roman", serif; 
      color: #282; 
      text-align: center; 
    } 
      
    #banner img { 
      float: left; 
    } 
      
    #columns { 
      background: #141; 
    } 
      
    #main { 
      margin-left: 13em; 
      padding-top: 4ex; 
      padding-left: 2em; 
      background: white; 
    } 
      
    #side { 
      float: left; 
      padding-top: 1em; 
      padding-left: 1em; 
      padding-bottom: 1em; 
      width: 12em; 
      background: #141; 
    } 
      
    #side a { 
      color: #bfb; 
      font-size: small; 
    } 
    get /store 
    
 
  
    
    Pragmatic Bookshelf
  
 
  
    
    
      Your Pragmatic Catalog 
  
     
    Pragmatic Project Automation 
    
       Pragmatic Project Automation  shows you how to improve the 
       consistency and repeatability of your project's procedures using 
       automation to reduce risk and errors.
      
      
        Simply put, we're going to put this thing called a computer to work 
        for you doing the mundane (but important) project stuff. That means 
        you'll have more time and energy to do the really 
        exciting---and difficult---stuff, like writing quality code.
      
    
    29.95 
    
   
  
     
    Pragmatic Unit Testing (C#) 
    
        Pragmatic programmers use feedback to drive their development and 
        personal processes. The most valuable feedback you can get while 
        coding comes from unit testing.
      
      
        Without good tests in place, coding can become a frustrating game of 
        "whack-a-mole." That's the carnival game where the player strikes at a 
        mechanical mole; it retreats and another mole pops up on the opposite side 
        of the field. The moles pop up and down so fast that you end up flailing 
        your mallet helplessly as the moles continue to pop up where you least 
        expect them.
      
    
    27.75 
    
   
  
     
    Pragmatic Version Control 
    
         This book is a recipe-based approach to using Subversion that will 
         get you up and running quickly---and correctly. All projects need
         version control: it's a foundational piece of any project's 
         infrastructure. Yet half of all project teams in the U.S. don't use
         any version control at all. Many others don't use it well, and end 
         up experiencing time-consuming problems.
      
    
    28.5 
    
   
     
   
     
    
    
      7.3 Iteration B3: Use a Helper to Format the Price 
     
    edit app/views/store/index.html.erb 
    <h1>Your Pragmatic Catalog</h1> 
      
    <% for product in @products -%> 
      <div class="entry"> 
        <%= image_tag(product.image_url) %> 
        <h3><%=h product.title %></h3> 
        <%= product.description %> 
        <div class="price-line"> 
        <span class="price"><%= number_to_currency(product.price) %></span> 
        </div> 
      </div> 
    <% end %> 
    get /store 
    
 
  
    
    Pragmatic Bookshelf
  
 
  
    
    
      Your Pragmatic Catalog 
  
     
    Pragmatic Project Automation 
    
       Pragmatic Project Automation  shows you how to improve the 
       consistency and repeatability of your project's procedures using 
       automation to reduce risk and errors.
      
      
        Simply put, we're going to put this thing called a computer to work 
        for you doing the mundane (but important) project stuff. That means 
        you'll have more time and energy to do the really 
        exciting---and difficult---stuff, like writing quality code.
      
    
    $29.95 
    
   
  
     
    Pragmatic Unit Testing (C#) 
    
        Pragmatic programmers use feedback to drive their development and 
        personal processes. The most valuable feedback you can get while 
        coding comes from unit testing.
      
      
        Without good tests in place, coding can become a frustrating game of 
        "whack-a-mole." That's the carnival game where the player strikes at a 
        mechanical mole; it retreats and another mole pops up on the opposite side 
        of the field. The moles pop up and down so fast that you end up flailing 
        your mallet helplessly as the moles continue to pop up where you least 
        expect them.
      
    
    $27.75 
    
   
  
     
    Pragmatic Version Control 
    
         This book is a recipe-based approach to using Subversion that will 
         get you up and running quickly---and correctly. All projects need
         version control: it's a foundational piece of any project's 
         infrastructure. Yet half of all project teams in the U.S. don't use
         any version control at all. Many others don't use it well, and end 
         up experiencing time-consuming problems.
      
    
    $28.50 
    
   
     
   
     
    
    
      7.4 Iteration B4: Linking to the Cart 
     
    edit app/views/store/index.html.erb 
        <%= button_to "Add to Cart" %> 
    edit public/stylesheets/depot.css 
    #store .entry form, #store .entry form div { 
      display: inline; 
    } 
    get /store 
    
 
  
    
    Pragmatic Bookshelf
  
 
  
    
    
      Your Pragmatic Catalog 
  
     
    Pragmatic Project Automation 
    
       Pragmatic Project Automation  shows you how to improve the 
       consistency and repeatability of your project's procedures using 
       automation to reduce risk and errors.
      
      
        Simply put, we're going to put this thing called a computer to work 
        for you doing the mundane (but important) project stuff. That means 
        you'll have more time and energy to do the really 
        exciting---and difficult---stuff, like writing quality code.
      
    
   
  
     
    Pragmatic Unit Testing (C#) 
    
        Pragmatic programmers use feedback to drive their development and 
        personal processes. The most valuable feedback you can get while 
        coding comes from unit testing.
      
      
        Without good tests in place, coding can become a frustrating game of 
        "whack-a-mole." That's the carnival game where the player strikes at a 
        mechanical mole; it retreats and another mole pops up on the opposite side 
        of the field. The moles pop up and down so fast that you end up flailing 
        your mallet helplessly as the moles continue to pop up where you least 
        expect them.
      
    
   
  
     
    Pragmatic Version Control 
    
         This book is a recipe-based approach to using Subversion that will 
         get you up and running quickly---and correctly. All projects need
         version control: it's a foundational piece of any project's 
         infrastructure. Yet half of all project teams in the U.S. don't use
         any version control at all. Many others don't use it well, and end 
         up experiencing time-consuming problems.
      
    
   
     
   
     
    
    
      8.1 Sessions 
     
    rake db:sessions:create 
    (in /home/rubys/git/awdwr/work/depot) 
          exists  db/migrate 
          create  db/migrate/20090518123259_create_sessions.rb 
    rake db:migrate 
    mv 20090518123259_create_sessions.rb 20080601000004_create_sessions.rb 
    (in /home/rubys/git/awdwr/work/depot) 
    ==  CreateSessions: migrating ================================================= 
    -- create_table(:sessions) 
       -> 0.0016s 
    -- add_index(:sessions, :session_id) 
       -> 0.0004s 
    -- add_index(:sessions, :updated_at) 
       -> 0.0003s 
    ==  CreateSessions: migrated (0.0025s) ======================================== 
      
    sqlite3 db/development.sqlite3 .schema 
    CREATE TABLE "products" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "title" varchar(255), "description" text, "image_url" varchar(255), "created_at" datetime, "updated_at" datetime, "price" decimal(8,2) DEFAULT 0); 
    CREATE TABLE "schema_migrations" ("version" varchar(255) NOT NULL); 
    CREATE TABLE "sessions" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "session_id" varchar(255) NOT NULL, "data" text, "created_at" datetime, "updated_at" datetime); 
    CREATE INDEX "index_sessions_on_session_id" ON "sessions" ("session_id"); 
    CREATE INDEX "index_sessions_on_updated_at" ON "sessions" ("updated_at"); 
    CREATE UNIQUE INDEX "unique_schema_migrations" ON "schema_migrations" ("version"); 
    edit config/initializers/session_store.rb 
    # Be sure to restart your server when you modify this file. 
      
    # Your secret key for verifying cookie session data integrity. 
    # If you change this key, all old sessions will become invalid! 
    # Make sure the secret is at least 30 characters and all random,  
    # no regular words or you'll be exposed to dictionary attacks. 
    ActionController::Base.session = { 
      :key         => '_depot_session', 
      :secret      => 'e7eb9b40f37b1374aa62010cdc14d06694955147849ef4b5653cfb3aa121a77ac1fecae4420b3357e9c6de6e20c00536739bee55c77274c7a9331fd74558de5c' 
    } 
      
    # Use the database for sessions instead of the cookie-based default, 
    # which shouldn't be used to store highly confidential information 
    # (create the session table with "rake db:sessions:create") 
    ActionController::Base.session_store = :active_record_store 
    restart 
    edit app/controllers/application_controller.rb 
    # Filters added to this controller apply to all controllers in the application. 
    # Likewise, all the methods added will be available for all controllers. 
      
    class ApplicationController < ActionController::Base 
      helper :all # include all helpers, all the time 
      protect_from_forgery # See ActionController::RequestForgeryProtection for details 
      
      # Scrub sensitive parameters from your log 
      # filter_parameter_logging :password 
    end 
    edit app/controllers/store_controller.rb 
    private 
      
      def find_cart 
        session[:cart] ||= Cart.new 
      end 
    
      8.2 Iteration C1: Creating a Cart 
     
    edit app/models/cart.rb 
    class Cart 
      attr_reader :items   # <wtf linkend="wtf.attr.accessor">attr_reader</wtf> 
       
      def initialize 
        @items = [] 
      end 
       
      def add_product(product) 
        @items << product 
      end 
    end 
    edit app/views/store/index.html.erb 
        <%= button_to "Add to Cart", :action => 'add_to_cart', :id => product %> 
    edit app/controllers/store_controller.rb 
      def add_to_cart 
        product = Product.find(params[:id]) # <label id="code.depot.f.find"/> 
        @cart = find_cart                   # <label id="code.depot.f.find2"/> 
        @cart.add_product(product)          # <label id="code.depot.f.add"/> 
      end 
    get /store/add_to_cart/2 
    
      <html xmlns="http://www.w3.org/1999/xhtml"> 
      <head> 
        <title>Action Controller: Exception caught</title> 
        <style> 
          body { background-color: #fff; color: #333; } 
       
          body, p, ol, ul, td { 
            font-family: verdana, arial, helvetica, sans-serif; 
            font-size:   13px; 
            line-height: 18px; 
          } 
       
          pre { 
            background-color: #eee; 
            padding: 10px; 
            font-size: 11px; 
          } 
       
          a { color: #000; } 
          a:visited { color: #666; } 
          a:hover { color: #fff; background-color:#000; } 
        </style> 
      </head> 
      <body> 
       
      <h1>Template is missing</h1> 
      <p>Missing template store/add_to_cart - {:locales=>[:en], :formats=>[:html, :all]} - partial: false.erb in view path /home/rubys/git/awdwr/work/depot/app/views</p> 
       
       
      </body> 
      </html> 
     
    edit app/views/store/add_to_cart.html.erb 
    <h2>Your Pragmatic Cart</h2> 
    <ul> 
      <% for item in @cart.items %> 
        <li><%=h item.title %></li> 
      <% end %> 
    </ul> 
    get /store/add_to_cart/2 
    
 
  
    
    Pragmatic Bookshelf
  
 
  
    
    
      Your Pragmatic Cart 
  
    Pragmatic Project Automation 
  
 
     
   
     
    
    get /store/add_to_cart/3 
    
 
  
    
    Pragmatic Bookshelf
  
 
  
    
    
      Your Pragmatic Cart 
  
    Pragmatic Project Automation 
  
    Pragmatic Version Control 
  
 
     
   
     
    
    
      8.3 Iteration C2: Creating a Smarter Cart 
     
    edit app/models/cart_item.rb 
    class CartItem 
     
      attr_reader :product, :quantity 
       
      def initialize(product) 
        @product = product 
        @quantity = 1 
      end 
       
      def increment_quantity 
        @quantity += 1 
      end 
       
      def title 
        @product.title 
      end 
       
      def price 
        @product.price * @quantity 
      end 
    end 
    edit app/models/cart.rb 
      def add_product(product) 
        current_item = @items.find {|item| item.product == product} 
        if current_item 
          current_item.increment_quantity 
        else 
          @items << CartItem.new(product) 
        end 
      end 
    edit app/views/store/add_to_cart.html.erb 
    <h2>Your Pragmatic Cart</h2> 
    <ul> 
      <% for item in @cart.items %> 
        <li><%= item.quantity %> × <%=h item.title %></li> 
      <% end %> 
    </ul> 
    get /store/add_to_cart/2 
    
      <html xmlns="http://www.w3.org/1999/xhtml"> 
      <head> 
        <title>Action Controller: Exception caught</title> 
        <style> 
          body { background-color: #fff; color: #333; } 
       
          body, p, ol, ul, td { 
            font-family: verdana, arial, helvetica, sans-serif; 
            font-size:   13px; 
            line-height: 18px; 
          } 
       
          pre { 
            background-color: #eee; 
            padding: 10px; 
            font-size: 11px; 
          } 
       
          a { color: #000; } 
          a:visited { color: #666; } 
          a:hover { color: #fff; background-color:#000; } 
        </style> 
      </head> 
      <body> 
       
      <h1> 
        NoMethodError 
         
          in StoreController#add_to_cart 
         
      </h1> 
      <pre>undefined method `product' for #<Product:0xb6f36324></pre> 
       
       
       
      <p><code>RAILS_ROOT: /home/rubys/git/awdwr/work/depot</code></p> 
       
      <div id="traces"> 
         
           
          <a href="#" onclick="document.getElementById('Framework-Trace').style.display='none';document.getElementById('Full-Trace').style.display='none';document.getElementById('Application-Trace').style.display='block';; return false;">Application Trace</a> | 
         
           
          <a href="#" onclick="document.getElementById('Application-Trace').style.display='none';document.getElementById('Full-Trace').style.display='none';document.getElementById('Framework-Trace').style.display='block';; return false;">Framework Trace</a> | 
         
           
          <a href="#" onclick="document.getElementById('Application-Trace').style.display='none';document.getElementById('Framework-Trace').style.display='none';document.getElementById('Full-Trace').style.display='block';; return false;">Full Trace</a>  
         
       
         
          <div id="Application-Trace" style="display: block;"> 
            <pre><code>/home/rubys/git/awdwr/work/depot/vendor/rails/activerecord/lib/active_record/attribute_methods.rb:266:in `method_missing' 
      /home/rubys/git/awdwr/work/depot/app/models/cart.rb:10:in `add_product' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/activesupport/lib/active_support/dependencies.rb:391:in `find' 
      /home/rubys/git/awdwr/work/depot/app/models/cart.rb:10:in `each' 
      /home/rubys/git/awdwr/work/depot/app/models/cart.rb:10:in `find' 
      /home/rubys/git/awdwr/work/depot/app/models/cart.rb:10:in `add_product' 
      /home/rubys/git/awdwr/work/depot/app/controllers/store_controller.rb:11:in `add_to_cart' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:869:in `send' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:869:in `perform_action_without_filters' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/chained/filters.rb:612:in `call_filters' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/chained/filters.rb:605:in `perform_action_without_benchmark' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/chained/benchmarking.rb:68:in `perform_action_without_rescue' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/activesupport/lib/active_support/core_ext/benchmark.rb:17:in `ms' 
      /usr/lib/ruby/1.8/benchmark.rb:308:in `realtime' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/activesupport/lib/active_support/core_ext/benchmark.rb:17:in `ms' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/chained/benchmarking.rb:68:in `perform_action_without_rescue' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/rescue.rb:45:in `perform_action_without_flash' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/chained/flash.rb:141:in `perform_action' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:530:in `send' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:530:in `process_without_filters' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/chained/filters.rb:601:in `process' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:374:in `action' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:382:in `action' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/routing/route_set.rb:433:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/routing/route_set.rb:433:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/head.rb:9:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/methodoverride.rb:24:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/middleware/params_parser.rb:17:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/middleware/session/abstract_store.rb:144:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/activerecord/lib/active_record/query_cache.rb:29:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/activerecord/lib/active_record/connection_adapters/abstract/query_cache.rb:34:in `cache' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/activerecord/lib/active_record/query_cache.rb:9:in `cache' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/activerecord/lib/active_record/query_cache.rb:28:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/activerecord/lib/active_record/connection_adapters/abstract/connection_pool.rb:363:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/middleware/rescue.rb:8:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/middleware/callbacks.rb:35:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/middleware/show_exceptions.rb:41:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/lock.rb:11:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/lock.rb:11:in `synchronize' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/lock.rb:11:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/railties/lib/rails/rack/static.rb:31:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/urlmap.rb:46:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/urlmap.rb:40:in `each' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/urlmap.rb:40:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/railties/lib/rails/rack/log_tailer.rb:17:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/content_length.rb:13:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/handler/webrick.rb:46:in `service' 
      /usr/lib/ruby/1.8/webrick/httpserver.rb:104:in `service' 
      /usr/lib/ruby/1.8/webrick/httpserver.rb:65:in `run' 
      /usr/lib/ruby/1.8/webrick/server.rb:173:in `start_thread' 
      /usr/lib/ruby/1.8/webrick/server.rb:162:in `start' 
      /usr/lib/ruby/1.8/webrick/server.rb:162:in `start_thread' 
      /usr/lib/ruby/1.8/webrick/server.rb:95:in `start' 
      /usr/lib/ruby/1.8/webrick/server.rb:92:in `each' 
      /usr/lib/ruby/1.8/webrick/server.rb:92:in `start' 
      /usr/lib/ruby/1.8/webrick/server.rb:23:in `start' 
      /usr/lib/ruby/1.8/webrick/server.rb:82:in `start' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/handler/webrick.rb:13:in `run' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/railties/lib/commands/server.rb:110 
      /usr/local/lib/site_ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require' 
      /usr/local/lib/site_ruby/1.8/rubygems/custom_require.rb:31:in `require' 
      makedepot.rb:2272:in `restart_server' 
      makedepot.rb:346 
      makedepot.rb:2351:in `call' 
      makedepot.rb:2351 
      makedepot.rb:2347:in `each' 
      makedepot.rb:2347 
      makedepot.rb:2310 
      makedepot.rb:2283</code></pre> 
          </div> 
         
          <div id="Framework-Trace" style="display: none;"> 
            <pre><code>/home/rubys/git/awdwr/work/depot/vendor/rails/activerecord/lib/active_record/attribute_methods.rb:266:in `method_missing' 
      /home/rubys/git/awdwr/work/depot/app/models/cart.rb:10:in `add_product' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/activesupport/lib/active_support/dependencies.rb:391:in `find' 
      /home/rubys/git/awdwr/work/depot/app/models/cart.rb:10:in `each' 
      /home/rubys/git/awdwr/work/depot/app/models/cart.rb:10:in `find' 
      /home/rubys/git/awdwr/work/depot/app/models/cart.rb:10:in `add_product' 
      /home/rubys/git/awdwr/work/depot/app/controllers/store_controller.rb:11:in `add_to_cart' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:869:in `send' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:869:in `perform_action_without_filters' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/chained/filters.rb:612:in `call_filters' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/chained/filters.rb:605:in `perform_action_without_benchmark' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/chained/benchmarking.rb:68:in `perform_action_without_rescue' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/activesupport/lib/active_support/core_ext/benchmark.rb:17:in `ms' 
      /usr/lib/ruby/1.8/benchmark.rb:308:in `realtime' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/activesupport/lib/active_support/core_ext/benchmark.rb:17:in `ms' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/chained/benchmarking.rb:68:in `perform_action_without_rescue' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/rescue.rb:45:in `perform_action_without_flash' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/chained/flash.rb:141:in `perform_action' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:530:in `send' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:530:in `process_without_filters' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/chained/filters.rb:601:in `process' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:374:in `action' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:382:in `action' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/routing/route_set.rb:433:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/routing/route_set.rb:433:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/head.rb:9:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/methodoverride.rb:24:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/middleware/params_parser.rb:17:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/middleware/session/abstract_store.rb:144:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/activerecord/lib/active_record/query_cache.rb:29:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/activerecord/lib/active_record/connection_adapters/abstract/query_cache.rb:34:in `cache' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/activerecord/lib/active_record/query_cache.rb:9:in `cache' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/activerecord/lib/active_record/query_cache.rb:28:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/activerecord/lib/active_record/connection_adapters/abstract/connection_pool.rb:363:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/middleware/rescue.rb:8:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/middleware/callbacks.rb:35:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/middleware/show_exceptions.rb:41:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/lock.rb:11:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/lock.rb:11:in `synchronize' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/lock.rb:11:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/railties/lib/rails/rack/static.rb:31:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/urlmap.rb:46:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/urlmap.rb:40:in `each' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/urlmap.rb:40:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/railties/lib/rails/rack/log_tailer.rb:17:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/content_length.rb:13:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/handler/webrick.rb:46:in `service' 
      /usr/lib/ruby/1.8/webrick/httpserver.rb:104:in `service' 
      /usr/lib/ruby/1.8/webrick/httpserver.rb:65:in `run' 
      /usr/lib/ruby/1.8/webrick/server.rb:173:in `start_thread' 
      /usr/lib/ruby/1.8/webrick/server.rb:162:in `start' 
      /usr/lib/ruby/1.8/webrick/server.rb:162:in `start_thread' 
      /usr/lib/ruby/1.8/webrick/server.rb:95:in `start' 
      /usr/lib/ruby/1.8/webrick/server.rb:92:in `each' 
      /usr/lib/ruby/1.8/webrick/server.rb:92:in `start' 
      /usr/lib/ruby/1.8/webrick/server.rb:23:in `start' 
      /usr/lib/ruby/1.8/webrick/server.rb:82:in `start' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/handler/webrick.rb:13:in `run' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/railties/lib/commands/server.rb:110 
      /usr/local/lib/site_ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require' 
      /usr/local/lib/site_ruby/1.8/rubygems/custom_require.rb:31:in `require' 
      /usr/lib/ruby/1.8/builder/xmlbase.rb:133:in `call' 
      /usr/lib/ruby/1.8/builder/xmlbase.rb:133:in `_nested_structures' 
      /usr/lib/ruby/1.8/builder/xmlbase.rb:57:in `method_missing' 
      /usr/lib/ruby/1.8/builder/xmlbase.rb:133:in `call' 
      /usr/lib/ruby/1.8/builder/xmlbase.rb:133:in `_nested_structures' 
      /usr/lib/ruby/1.8/builder/xmlbase.rb:57:in `method_missing'</code></pre> 
          </div> 
         
          <div id="Full-Trace" style="display: none;"> 
            <pre><code>/home/rubys/git/awdwr/work/depot/vendor/rails/activerecord/lib/active_record/attribute_methods.rb:266:in `method_missing' 
      /home/rubys/git/awdwr/work/depot/app/models/cart.rb:10:in `add_product' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/activesupport/lib/active_support/dependencies.rb:391:in `find' 
      /home/rubys/git/awdwr/work/depot/app/models/cart.rb:10:in `each' 
      /home/rubys/git/awdwr/work/depot/app/models/cart.rb:10:in `find' 
      /home/rubys/git/awdwr/work/depot/app/models/cart.rb:10:in `add_product' 
      /home/rubys/git/awdwr/work/depot/app/controllers/store_controller.rb:11:in `add_to_cart' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:869:in `send' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:869:in `perform_action_without_filters' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/chained/filters.rb:612:in `call_filters' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/chained/filters.rb:605:in `perform_action_without_benchmark' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/chained/benchmarking.rb:68:in `perform_action_without_rescue' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/activesupport/lib/active_support/core_ext/benchmark.rb:17:in `ms' 
      /usr/lib/ruby/1.8/benchmark.rb:308:in `realtime' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/activesupport/lib/active_support/core_ext/benchmark.rb:17:in `ms' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/chained/benchmarking.rb:68:in `perform_action_without_rescue' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/rescue.rb:45:in `perform_action_without_flash' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/chained/flash.rb:141:in `perform_action' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:530:in `send' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:530:in `process_without_filters' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/chained/filters.rb:601:in `process' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:374:in `action' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:382:in `action' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/routing/route_set.rb:433:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/routing/route_set.rb:433:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/head.rb:9:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/methodoverride.rb:24:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/middleware/params_parser.rb:17:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/middleware/session/abstract_store.rb:144:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/activerecord/lib/active_record/query_cache.rb:29:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/activerecord/lib/active_record/connection_adapters/abstract/query_cache.rb:34:in `cache' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/activerecord/lib/active_record/query_cache.rb:9:in `cache' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/activerecord/lib/active_record/query_cache.rb:28:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/activerecord/lib/active_record/connection_adapters/abstract/connection_pool.rb:363:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/middleware/rescue.rb:8:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/middleware/callbacks.rb:35:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/middleware/show_exceptions.rb:41:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/lock.rb:11:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/lock.rb:11:in `synchronize' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/lock.rb:11:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/railties/lib/rails/rack/static.rb:31:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/urlmap.rb:46:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/urlmap.rb:40:in `each' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/urlmap.rb:40:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/railties/lib/rails/rack/log_tailer.rb:17:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/content_length.rb:13:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/handler/webrick.rb:46:in `service' 
      /usr/lib/ruby/1.8/webrick/httpserver.rb:104:in `service' 
      /usr/lib/ruby/1.8/webrick/httpserver.rb:65:in `run' 
      /usr/lib/ruby/1.8/webrick/server.rb:173:in `start_thread' 
      /usr/lib/ruby/1.8/webrick/server.rb:162:in `start' 
      /usr/lib/ruby/1.8/webrick/server.rb:162:in `start_thread' 
      /usr/lib/ruby/1.8/webrick/server.rb:95:in `start' 
      /usr/lib/ruby/1.8/webrick/server.rb:92:in `each' 
      /usr/lib/ruby/1.8/webrick/server.rb:92:in `start' 
      /usr/lib/ruby/1.8/webrick/server.rb:23:in `start' 
      /usr/lib/ruby/1.8/webrick/server.rb:82:in `start' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/handler/webrick.rb:13:in `run' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/railties/lib/commands/server.rb:110 
      /usr/local/lib/site_ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require' 
      /usr/local/lib/site_ruby/1.8/rubygems/custom_require.rb:31:in `require' 
      makedepot.rb:2272:in `restart_server' 
      makedepot.rb:346 
      makedepot.rb:2351:in `call' 
      makedepot.rb:2351 
      makedepot.rb:2347:in `each' 
      makedepot.rb:2347 
      /usr/lib/ruby/1.8/builder/xmlbase.rb:133:in `call' 
      /usr/lib/ruby/1.8/builder/xmlbase.rb:133:in `_nested_structures' 
      /usr/lib/ruby/1.8/builder/xmlbase.rb:57:in `method_missing' 
      makedepot.rb:2310 
      /usr/lib/ruby/1.8/builder/xmlbase.rb:133:in `call' 
      /usr/lib/ruby/1.8/builder/xmlbase.rb:133:in `_nested_structures' 
      /usr/lib/ruby/1.8/builder/xmlbase.rb:57:in `method_missing' 
      makedepot.rb:2283</code></pre> 
          </div> 
         
      </div> 
       
       
       
       
       
      <h2 style="margin-top: 30px">Request</h2> 
      <p><b>Parameters</b>: <pre>{"id"=>"2"}</pre></p> 
       
      <p><a href="#" onclick="document.getElementById('session_dump').style.display='block'; return false;">Show session dump</a></p> 
      <div id="session_dump" style="display:none"><pre class='debug_dump'>---  
      </pre></div> 
       
       
      <h2 style="margin-top: 30px">Response</h2> 
      <p><b>Headers</b>: <pre>None</pre></p> 
       
       
       
      </body> 
      </html> 
     
    rake db:sessions:clear 
    (in /home/rubys/git/awdwr/work/depot) 
    restart 
    get /store/add_to_cart/2 
    
 
  
    
    Pragmatic Bookshelf
  
 
  
    
    
      Your Pragmatic Cart 
  
    1 × Pragmatic Project Automation 
  
 
     
   
     
    
    get /store/add_to_cart/2 
    
 
  
    
    Pragmatic Bookshelf
  
 
  
    
    
      Your Pragmatic Cart 
  
    2 × Pragmatic Project Automation 
  
 
     
   
     
    
    get /store/add_to_cart/3 
    
 
  
    
    Pragmatic Bookshelf
  
 
  
    
    
      Your Pragmatic Cart 
  
    2 × Pragmatic Project Automation 
  
    1 × Pragmatic Version Control 
  
 
     
   
     
    
    get /store/add_to_cart/wibble 
    
  ActiveRecord::RecordNotFound
  
    in StoreController#add_to_cart
  
 
Couldn't find Product with ID=wibble 
RAILS_ROOT: /home/rubys/git/awdwr/work/depot
  
    
    Application Trace  |
  
    
    
Framework Trace  |
  
    
    
Full Trace  
  
  
    
      /home/rubys/git/awdwr/work/depot/vendor/rails/activerecord/lib/active_record/base.rb:1599:in `find_one'
/home/rubys/git/awdwr/work/depot/vendor/rails/activerecord/lib/active_record/base.rb:1582:in `find_from_ids'
/home/rubys/git/awdwr/work/depot/vendor/rails/activerecord/lib/active_record/base.rb:626:in `find'
/home/rubys/git/awdwr/work/depot/app/controllers/store_controller.rb:9:in `add_to_cart'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:869:in `send'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:869:in `perform_action_without_filters'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/chained/filters.rb:612:in `call_filters'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/chained/filters.rb:605:in `perform_action_without_benchmark'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/chained/benchmarking.rb:68:in `perform_action_without_rescue'
/home/rubys/git/awdwr/work/depot/vendor/rails/activesupport/lib/active_support/core_ext/benchmark.rb:17:in `ms'
/usr/lib/ruby/1.8/benchmark.rb:308:in `realtime'
/home/rubys/git/awdwr/work/depot/vendor/rails/activesupport/lib/active_support/core_ext/benchmark.rb:17:in `ms'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/chained/benchmarking.rb:68:in `perform_action_without_rescue'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/rescue.rb:45:in `perform_action_without_flash'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/chained/flash.rb:141:in `perform_action'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:530:in `send'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:530:in `process_without_filters'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/chained/filters.rb:601:in `process'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:374:in `action'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:382:in `action'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/routing/route_set.rb:433:in `call'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/routing/route_set.rb:433:in `call'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/head.rb:9:in `call'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/methodoverride.rb:24:in `call'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/middleware/params_parser.rb:17:in `call'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/middleware/session/abstract_store.rb:144:in `call'
/home/rubys/git/awdwr/work/depot/vendor/rails/activerecord/lib/active_record/query_cache.rb:29:in `call'
/home/rubys/git/awdwr/work/depot/vendor/rails/activerecord/lib/active_record/connection_adapters/abstract/query_cache.rb:34:in `cache'
/home/rubys/git/awdwr/work/depot/vendor/rails/activerecord/lib/active_record/query_cache.rb:9:in `cache'
/home/rubys/git/awdwr/work/depot/vendor/rails/activerecord/lib/active_record/query_cache.rb:28:in `call'
/home/rubys/git/awdwr/work/depot/vendor/rails/activerecord/lib/active_record/connection_adapters/abstract/connection_pool.rb:363:in `call'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/middleware/rescue.rb:8:in `call'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/middleware/callbacks.rb:35:in `call'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/middleware/show_exceptions.rb:41:in `call'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/lock.rb:11:in `call'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/lock.rb:11:in `synchronize'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/lock.rb:11:in `call'
/home/rubys/git/awdwr/work/depot/vendor/rails/railties/lib/rails/rack/static.rb:31:in `call'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/urlmap.rb:46:in `call'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/urlmap.rb:40:in `each'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/urlmap.rb:40:in `call'
/home/rubys/git/awdwr/work/depot/vendor/rails/railties/lib/rails/rack/log_tailer.rb:17:in `call'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/content_length.rb:13:in `call'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/handler/webrick.rb:46:in `service'
/usr/lib/ruby/1.8/webrick/httpserver.rb:104:in `service'
/usr/lib/ruby/1.8/webrick/httpserver.rb:65:in `run'
/usr/lib/ruby/1.8/webrick/server.rb:173:in `start_thread'
/usr/lib/ruby/1.8/webrick/server.rb:162:in `start'
/usr/lib/ruby/1.8/webrick/server.rb:162:in `start_thread'
/usr/lib/ruby/1.8/webrick/server.rb:95:in `start'
/usr/lib/ruby/1.8/webrick/server.rb:92:in `each'
/usr/lib/ruby/1.8/webrick/server.rb:92:in `start'
/usr/lib/ruby/1.8/webrick/server.rb:23:in `start'
/usr/lib/ruby/1.8/webrick/server.rb:82:in `start'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/handler/webrick.rb:13:in `run'
/home/rubys/git/awdwr/work/depot/vendor/rails/railties/lib/commands/server.rb:110
/usr/local/lib/site_ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require'
/usr/local/lib/site_ruby/1.8/rubygems/custom_require.rb:31:in `require'
makedepot.rb:2272:in `restart_server'
makedepot.rb:421
makedepot.rb:2351:in `call'
makedepot.rb:2351
makedepot.rb:2347:in `each'
makedepot.rb:2347
makedepot.rb:2310
makedepot.rb:2283 
     
  
    
      /home/rubys/git/awdwr/work/depot/vendor/rails/activerecord/lib/active_record/base.rb:1599:in `find_one'
/home/rubys/git/awdwr/work/depot/vendor/rails/activerecord/lib/active_record/base.rb:1582:in `find_from_ids'
/home/rubys/git/awdwr/work/depot/vendor/rails/activerecord/lib/active_record/base.rb:626:in `find'
/home/rubys/git/awdwr/work/depot/app/controllers/store_controller.rb:9:in `add_to_cart'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:869:in `send'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:869:in `perform_action_without_filters'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/chained/filters.rb:612:in `call_filters'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/chained/filters.rb:605:in `perform_action_without_benchmark'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/chained/benchmarking.rb:68:in `perform_action_without_rescue'
/home/rubys/git/awdwr/work/depot/vendor/rails/activesupport/lib/active_support/core_ext/benchmark.rb:17:in `ms'
/usr/lib/ruby/1.8/benchmark.rb:308:in `realtime'
/home/rubys/git/awdwr/work/depot/vendor/rails/activesupport/lib/active_support/core_ext/benchmark.rb:17:in `ms'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/chained/benchmarking.rb:68:in `perform_action_without_rescue'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/rescue.rb:45:in `perform_action_without_flash'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/chained/flash.rb:141:in `perform_action'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:530:in `send'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:530:in `process_without_filters'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/chained/filters.rb:601:in `process'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:374:in `action'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:382:in `action'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/routing/route_set.rb:433:in `call'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/routing/route_set.rb:433:in `call'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/head.rb:9:in `call'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/methodoverride.rb:24:in `call'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/middleware/params_parser.rb:17:in `call'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/middleware/session/abstract_store.rb:144:in `call'
/home/rubys/git/awdwr/work/depot/vendor/rails/activerecord/lib/active_record/query_cache.rb:29:in `call'
/home/rubys/git/awdwr/work/depot/vendor/rails/activerecord/lib/active_record/connection_adapters/abstract/query_cache.rb:34:in `cache'
/home/rubys/git/awdwr/work/depot/vendor/rails/activerecord/lib/active_record/query_cache.rb:9:in `cache'
/home/rubys/git/awdwr/work/depot/vendor/rails/activerecord/lib/active_record/query_cache.rb:28:in `call'
/home/rubys/git/awdwr/work/depot/vendor/rails/activerecord/lib/active_record/connection_adapters/abstract/connection_pool.rb:363:in `call'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/middleware/rescue.rb:8:in `call'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/middleware/callbacks.rb:35:in `call'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/middleware/show_exceptions.rb:41:in `call'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/lock.rb:11:in `call'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/lock.rb:11:in `synchronize'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/lock.rb:11:in `call'
/home/rubys/git/awdwr/work/depot/vendor/rails/railties/lib/rails/rack/static.rb:31:in `call'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/urlmap.rb:46:in `call'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/urlmap.rb:40:in `each'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/urlmap.rb:40:in `call'
/home/rubys/git/awdwr/work/depot/vendor/rails/railties/lib/rails/rack/log_tailer.rb:17:in `call'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/content_length.rb:13:in `call'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/handler/webrick.rb:46:in `service'
/usr/lib/ruby/1.8/webrick/httpserver.rb:104:in `service'
/usr/lib/ruby/1.8/webrick/httpserver.rb:65:in `run'
/usr/lib/ruby/1.8/webrick/server.rb:173:in `start_thread'
/usr/lib/ruby/1.8/webrick/server.rb:162:in `start'
/usr/lib/ruby/1.8/webrick/server.rb:162:in `start_thread'
/usr/lib/ruby/1.8/webrick/server.rb:95:in `start'
/usr/lib/ruby/1.8/webrick/server.rb:92:in `each'
/usr/lib/ruby/1.8/webrick/server.rb:92:in `start'
/usr/lib/ruby/1.8/webrick/server.rb:23:in `start'
/usr/lib/ruby/1.8/webrick/server.rb:82:in `start'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/handler/webrick.rb:13:in `run'
/home/rubys/git/awdwr/work/depot/vendor/rails/railties/lib/commands/server.rb:110
/usr/local/lib/site_ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require'
/usr/local/lib/site_ruby/1.8/rubygems/custom_require.rb:31:in `require'
/usr/lib/ruby/1.8/builder/xmlbase.rb:133:in `call'
/usr/lib/ruby/1.8/builder/xmlbase.rb:133:in `_nested_structures'
/usr/lib/ruby/1.8/builder/xmlbase.rb:57:in `method_missing'
/usr/lib/ruby/1.8/builder/xmlbase.rb:133:in `call'
/usr/lib/ruby/1.8/builder/xmlbase.rb:133:in `_nested_structures'
/usr/lib/ruby/1.8/builder/xmlbase.rb:57:in `method_missing' 
     
  
    
      /home/rubys/git/awdwr/work/depot/vendor/rails/activerecord/lib/active_record/base.rb:1599:in `find_one'
/home/rubys/git/awdwr/work/depot/vendor/rails/activerecord/lib/active_record/base.rb:1582:in `find_from_ids'
/home/rubys/git/awdwr/work/depot/vendor/rails/activerecord/lib/active_record/base.rb:626:in `find'
/home/rubys/git/awdwr/work/depot/app/controllers/store_controller.rb:9:in `add_to_cart'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:869:in `send'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:869:in `perform_action_without_filters'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/chained/filters.rb:612:in `call_filters'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/chained/filters.rb:605:in `perform_action_without_benchmark'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/chained/benchmarking.rb:68:in `perform_action_without_rescue'
/home/rubys/git/awdwr/work/depot/vendor/rails/activesupport/lib/active_support/core_ext/benchmark.rb:17:in `ms'
/usr/lib/ruby/1.8/benchmark.rb:308:in `realtime'
/home/rubys/git/awdwr/work/depot/vendor/rails/activesupport/lib/active_support/core_ext/benchmark.rb:17:in `ms'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/chained/benchmarking.rb:68:in `perform_action_without_rescue'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/rescue.rb:45:in `perform_action_without_flash'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/chained/flash.rb:141:in `perform_action'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:530:in `send'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:530:in `process_without_filters'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/chained/filters.rb:601:in `process'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:374:in `action'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:382:in `action'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/routing/route_set.rb:433:in `call'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/routing/route_set.rb:433:in `call'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/head.rb:9:in `call'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/methodoverride.rb:24:in `call'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/middleware/params_parser.rb:17:in `call'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/middleware/session/abstract_store.rb:144:in `call'
/home/rubys/git/awdwr/work/depot/vendor/rails/activerecord/lib/active_record/query_cache.rb:29:in `call'
/home/rubys/git/awdwr/work/depot/vendor/rails/activerecord/lib/active_record/connection_adapters/abstract/query_cache.rb:34:in `cache'
/home/rubys/git/awdwr/work/depot/vendor/rails/activerecord/lib/active_record/query_cache.rb:9:in `cache'
/home/rubys/git/awdwr/work/depot/vendor/rails/activerecord/lib/active_record/query_cache.rb:28:in `call'
/home/rubys/git/awdwr/work/depot/vendor/rails/activerecord/lib/active_record/connection_adapters/abstract/connection_pool.rb:363:in `call'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/middleware/rescue.rb:8:in `call'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/middleware/callbacks.rb:35:in `call'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/middleware/show_exceptions.rb:41:in `call'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/lock.rb:11:in `call'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/lock.rb:11:in `synchronize'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/lock.rb:11:in `call'
/home/rubys/git/awdwr/work/depot/vendor/rails/railties/lib/rails/rack/static.rb:31:in `call'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/urlmap.rb:46:in `call'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/urlmap.rb:40:in `each'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/urlmap.rb:40:in `call'
/home/rubys/git/awdwr/work/depot/vendor/rails/railties/lib/rails/rack/log_tailer.rb:17:in `call'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/content_length.rb:13:in `call'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/handler/webrick.rb:46:in `service'
/usr/lib/ruby/1.8/webrick/httpserver.rb:104:in `service'
/usr/lib/ruby/1.8/webrick/httpserver.rb:65:in `run'
/usr/lib/ruby/1.8/webrick/server.rb:173:in `start_thread'
/usr/lib/ruby/1.8/webrick/server.rb:162:in `start'
/usr/lib/ruby/1.8/webrick/server.rb:162:in `start_thread'
/usr/lib/ruby/1.8/webrick/server.rb:95:in `start'
/usr/lib/ruby/1.8/webrick/server.rb:92:in `each'
/usr/lib/ruby/1.8/webrick/server.rb:92:in `start'
/usr/lib/ruby/1.8/webrick/server.rb:23:in `start'
/usr/lib/ruby/1.8/webrick/server.rb:82:in `start'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/handler/webrick.rb:13:in `run'
/home/rubys/git/awdwr/work/depot/vendor/rails/railties/lib/commands/server.rb:110
/usr/local/lib/site_ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require'
/usr/local/lib/site_ruby/1.8/rubygems/custom_require.rb:31:in `require'
makedepot.rb:2272:in `restart_server'
makedepot.rb:421
makedepot.rb:2351:in `call'
makedepot.rb:2351
makedepot.rb:2347:in `each'
makedepot.rb:2347
/usr/lib/ruby/1.8/builder/xmlbase.rb:133:in `call'
/usr/lib/ruby/1.8/builder/xmlbase.rb:133:in `_nested_structures'
/usr/lib/ruby/1.8/builder/xmlbase.rb:57:in `method_missing'
makedepot.rb:2310
/usr/lib/ruby/1.8/builder/xmlbase.rb:133:in `call'
/usr/lib/ruby/1.8/builder/xmlbase.rb:133:in `_nested_structures'
/usr/lib/ruby/1.8/builder/xmlbase.rb:57:in `method_missing'
makedepot.rb:2283 
     
  
 
Request 
Parameters : 
{"id"=>"wibble"} 
Show session dump 
Response 
Headers : 
None 
     
    
    
      8.4 Iteration C3: Handling Errors 
     
    edit app/controllers/store_controller.rb 
      def add_to_cart 
        product = Product.find(params[:id]) 
        @cart = find_cart 
        @cart.add_product(product) 
      rescue ActiveRecord::RecordNotFound 
        logger.error("Attempt to access invalid product #{params[:id]}") 
        flash[:notice] = "Invalid product" 
        redirect_to :action => 'index' 
      end 
    get /store/add_to_cart/wibble 
    
You are being 
redirected .    
 
    
    get http://127.0.0.1:3000/store 
    
 
  
    
    Pragmatic Bookshelf
  
 
  
    
    
      Your Pragmatic Catalog 
  
     
    Pragmatic Project Automation 
    
       Pragmatic Project Automation  shows you how to improve the 
       consistency and repeatability of your project's procedures using 
       automation to reduce risk and errors.
      
      
        Simply put, we're going to put this thing called a computer to work 
        for you doing the mundane (but important) project stuff. That means 
        you'll have more time and energy to do the really 
        exciting---and difficult---stuff, like writing quality code.
      
    
   
  
     
    Pragmatic Unit Testing (C#) 
    
        Pragmatic programmers use feedback to drive their development and 
        personal processes. The most valuable feedback you can get while 
        coding comes from unit testing.
      
      
        Without good tests in place, coding can become a frustrating game of 
        "whack-a-mole." That's the carnival game where the player strikes at a 
        mechanical mole; it retreats and another mole pops up on the opposite side 
        of the field. The moles pop up and down so fast that you end up flailing 
        your mallet helplessly as the moles continue to pop up where you least 
        expect them.
      
    
   
  
     
    Pragmatic Version Control 
    
         This book is a recipe-based approach to using Subversion that will 
         get you up and running quickly---and correctly. All projects need
         version control: it's a foundational piece of any project's 
         infrastructure. Yet half of all project teams in the U.S. don't use
         any version control at all. Many others don't use it well, and end 
         up experiencing time-consuming problems.
      
    
   
     
   
     
    
    tail -17 log/development.log 
      
      
      
      
    Processing StoreController#add_to_cart (for 127.0.0.1 at 2009-05-18 08:33:18) [GET] 
      Parameters: {"id"=>"wibble"} 
      *[4;36;1mProduct Load (0.1ms)*[0m   *[0;1mSELECT * FROM "products" WHERE ("products"."id" = 0) *[0m 
    Attempt to access invalid product wibble 
    Redirected to http://127.0.0.1:3000/store 
    Completed in 21ms (DB: 0) | 302 Found [http://127.0.0.1/store/add_to_cart/wibble] 
      
      
    Processing StoreController#index (for 127.0.0.1 at 2009-05-18 08:33:18) [GET] 
      *[4;35;1mProduct Load (0.8ms)*[0m   *[0mSELECT * FROM "products" ORDER BY title*[0m 
    Rendering /home/rubys/git/awdwr/work/depot/app/views/store/index.html.erb 
    Rendering template within /home/rubys/git/awdwr/work/depot/app/views/layouts/store.html.erb 
    Completed in 131ms (View: 123, DB: 1) | 200 OK [http://127.0.0.1/store] 
    edit app/views/layouts/store.html.erb 
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
                          "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
    <html> 
    <head> 
      <title>Pragprog Books Online Store</title> 
      <%= stylesheet_link_tag "depot", :media => "all" %> 
    </head> 
    <body id="store"> 
      <div id="banner"> 
        <%= image_tag("logo.png") %> 
        <%= @page_title || "Pragmatic Bookshelf" %> 
      </div> 
      <div id="columns"> 
        <div id="side"> 
          <a href="http://www....">Home</a><br /> 
          <a href="http://www..../faq">Questions</a><br /> 
          <a href="http://www..../news">News</a><br /> 
          <a href="http://www..../contact">Contact</a><br /> 
        </div> 
        <div id="main"> 
          <% if flash[:notice] -%> 
            <div id="notice"><%= flash[:notice] %></div> 
          <% end -%> 
     
          <%= yield :layout %> 
        </div> 
      </div> 
    </body> 
    </html> 
    edit public/stylesheets/depot.css 
    #notice { 
      border: 2px solid red; 
      padding: 1em; 
      margin-bottom: 2em; 
      background-color: #f0f0f0; 
      font: bold smaller sans-serif; 
    } 
    get /store/add_to_cart/wibble 
    
You are being 
redirected .    
 
    
    get http://127.0.0.1:3000/store 
    
 
  
    
    Pragmatic Bookshelf
  
 
  
    
    
      
      
              Invalid product
            
      
      Your Pragmatic Catalog 
  
     
    Pragmatic Project Automation 
    
       Pragmatic Project Automation  shows you how to improve the 
       consistency and repeatability of your project's procedures using 
       automation to reduce risk and errors.
      
      
        Simply put, we're going to put this thing called a computer to work 
        for you doing the mundane (but important) project stuff. That means 
        you'll have more time and energy to do the really 
        exciting---and difficult---stuff, like writing quality code.
      
    
   
  
     
    Pragmatic Unit Testing (C#) 
    
        Pragmatic programmers use feedback to drive their development and 
        personal processes. The most valuable feedback you can get while 
        coding comes from unit testing.
      
      
        Without good tests in place, coding can become a frustrating game of 
        "whack-a-mole." That's the carnival game where the player strikes at a 
        mechanical mole; it retreats and another mole pops up on the opposite side 
        of the field. The moles pop up and down so fast that you end up flailing 
        your mallet helplessly as the moles continue to pop up where you least 
        expect them.
      
    
   
  
     
    Pragmatic Version Control 
    
         This book is a recipe-based approach to using Subversion that will 
         get you up and running quickly---and correctly. All projects need
         version control: it's a foundational piece of any project's 
         infrastructure. Yet half of all project teams in the U.S. don't use
         any version control at all. Many others don't use it well, and end 
         up experiencing time-consuming problems.
      
    
   
     
   
     
    
    
      8.5 Iteration C4: Finishing the Cart 
     
    edit app/views/store/add_to_cart.html.erb 
    <h2>Your Pragmatic Cart</h2> 
    <ul> 
      <% for item in @cart.items %> 
        <li><%= item.quantity %> × <%=h item.title %></li> 
      <% end %> 
    </ul> 
     
    <%= button_to 'Empty cart', :action => 'empty_cart' %> 
    edit app/controllers/store_controller.rb 
      def empty_cart 
        session[:cart] = nil 
        flash[:notice] = "Your cart is currently empty" 
        redirect_to :action => 'index' 
      end 
    get /store/empty_cart 
    
You are being 
redirected .    
 
    
    get http://127.0.0.1:3000/store 
    
 
  
    
    Pragmatic Bookshelf
  
 
  
    
    
      
      
              Your cart is currently empty
            
      
      Your Pragmatic Catalog 
  
     
    Pragmatic Project Automation 
    
       Pragmatic Project Automation  shows you how to improve the 
       consistency and repeatability of your project's procedures using 
       automation to reduce risk and errors.
      
      
        Simply put, we're going to put this thing called a computer to work 
        for you doing the mundane (but important) project stuff. That means 
        you'll have more time and energy to do the really 
        exciting---and difficult---stuff, like writing quality code.
      
    
   
  
     
    Pragmatic Unit Testing (C#) 
    
        Pragmatic programmers use feedback to drive their development and 
        personal processes. The most valuable feedback you can get while 
        coding comes from unit testing.
      
      
        Without good tests in place, coding can become a frustrating game of 
        "whack-a-mole." That's the carnival game where the player strikes at a 
        mechanical mole; it retreats and another mole pops up on the opposite side 
        of the field. The moles pop up and down so fast that you end up flailing 
        your mallet helplessly as the moles continue to pop up where you least 
        expect them.
      
    
   
  
     
    Pragmatic Version Control 
    
         This book is a recipe-based approach to using Subversion that will 
         get you up and running quickly---and correctly. All projects need
         version control: it's a foundational piece of any project's 
         infrastructure. Yet half of all project teams in the U.S. don't use
         any version control at all. Many others don't use it well, and end 
         up experiencing time-consuming problems.
      
    
   
     
   
     
    
    edit app/controllers/store_controller.rb 
      def add_to_cart 
        product = Product.find(params[:id]) 
        @cart = find_cart 
        @cart.add_product(product) 
      rescue ActiveRecord::RecordNotFound 
        logger.error("Attempt to access invalid product #{params[:id]}") 
        redirect_to_index("Invalid product") 
      end 
      
      def empty_cart 
        session[:cart] = nil 
        redirect_to_index("Your cart is currently empty") 
      end 
      
    private 
      
      def redirect_to_index(msg) 
        flash[:notice] = msg 
        redirect_to :action => 'index' 
      end 
    edit app/views/store/add_to_cart.html.erb 
    <div class="cart-title">Your Cart</div> 
    <table> 
      <% for item in @cart.items %> 
        <tr> 
          <td><%= item.quantity %>×</td> 
          <td><%=h item.title %></td> 
          <td class="item-price"><%= number_to_currency(item.price) %></td> 
        </tr> 
      <% end %>   
       
      <tr class="total-line"> 
        <td colspan="2">Total</td> 
        <td class="total-cell"><%= number_to_currency(@cart.total_price) %></td> 
      </tr> 
      
    </table> 
       
    <%= button_to "Empty cart", :action => :empty_cart %> 
    edit public/stylesheets/depot.css 
    /* Styles for the cart in the main page */ 
      
    .cart-title { 
      font: 120% bold; 
    } 
      
    .item-price, .total-line { 
      text-align: right; 
    } 
      
    .total-line .total-cell { 
      font-weight: bold; 
      border-top: 1px solid #595; 
    } 
    edit app/models/cart.rb 
    class Cart 
      attr_reader :items   # <wtf linkend="wtf.attr.accessor">attr_reader</wtf> 
       
      def initialize 
        @items = [] 
      end 
       
      def add_product(product) 
        current_item = @items.find {|item| item.product == product} 
        if current_item 
          current_item.increment_quantity 
        else 
          @items << CartItem.new(product) 
        end 
      end 
     
      def total_price 
        @items.sum { |item| item.price } 
      end 
    end 
    restart 
    get /store/add_to_cart/2 
    
 
  
    
    Pragmatic Bookshelf
  
 
  
     
    
    get /store/add_to_cart/2 
    
 
  
    
    Pragmatic Bookshelf
  
 
  
     
    
    get /store/add_to_cart/3 
    
 
  
    
    Pragmatic Bookshelf
  
 
  
     
    
    
      9.1 Iteration D1: Moving the Cart 
     
    edit app/views/store/add_to_cart.html.erb 
    <div class="cart-title">Your Cart</div> 
    <table> 
      <%= render(:partial => "cart_item", :collection => @cart.items) %>   
       
      <tr class="total-line"> 
        <td colspan="2">Total</td> 
        <td class="total-cell"><%= number_to_currency(@cart.total_price) %></td> 
      </tr> 
      
    </table> 
       
    <%= button_to "Empty cart", :action => :empty_cart %> 
    edit app/views/store/_cart_item.html.erb 
    <tr> 
      <td><%= cart_item.quantity %>×</td> 
      <td><%=h cart_item.title %></td> 
      <td class="item-price"><%= number_to_currency(cart_item.price) %></td> 
    </tr> 
    cp app/views/store/add_to_cart.html.erb app/views/store/_cart.html.erb 
    edit app/views/store/_cart.html.erb 
    <div class="cart-title">Your Cart</div> 
    <table> 
      <%= render(:partial => "cart_item", :collection => cart.items) %>   
       
      <tr class="total-line"> 
        <td colspan="2">Total</td> 
        <td class="total-cell"><%= number_to_currency(cart.total_price) %></td> 
      </tr> 
      
    </table> 
       
    <%= button_to "Empty cart", :action => :empty_cart %> 
    edit app/views/layouts/store.html.erb 
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
                          "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
    <html> 
    <head> 
      <title>Pragprog Books Online Store</title> 
      <%= stylesheet_link_tag "depot", :media => "all" %> 
    </head> 
    <body id="store"> 
      <div id="banner"> 
        <%= image_tag("logo.png") %> 
        <%= @page_title || "Pragmatic Bookshelf" %> 
      </div> 
      <div id="columns"> 
        <div id="side"> 
          <div id="cart"> 
            <%= render(:partial => "cart", :object => @cart) %> 
          </div> 
      
          <a href="http://www....">Home</a><br /> 
          <a href="http://www..../faq">Questions</a><br /> 
          <a href="http://www..../news">News</a><br /> 
          <a href="http://www..../contact">Contact</a><br /> 
        </div> 
        <div id="main"> 
          <% if flash[:notice] -%> 
            <div id="notice"><%= flash[:notice] %></div> 
          <% end -%> 
      
          <%= yield :layout %> 
        </div> 
      </div> 
    </body> 
    </html> 
    edit app/controllers/store_controller.rb 
      def index 
        @products = Product.find_products_for_sale 
        @cart = find_cart 
      end 
    edit public/stylesheets/depot.css 
    /* Styles for the cart in the sidebar */ 
      
    #cart, #cart table { 
      font-size: smaller; 
      color:     white; 
    } 
      
    #cart table { 
      border-top:    1px dotted #595; 
      border-bottom: 1px dotted #595; 
      margin-bottom: 10px; 
    } 
    get /store 
    
 
  
    
    Pragmatic Bookshelf
  
 
  
    
    
      
            
      Your Pragmatic Catalog 
  
     
    Pragmatic Project Automation 
    
       Pragmatic Project Automation  shows you how to improve the 
       consistency and repeatability of your project's procedures using 
       automation to reduce risk and errors.
      
      
        Simply put, we're going to put this thing called a computer to work 
        for you doing the mundane (but important) project stuff. That means 
        you'll have more time and energy to do the really 
        exciting---and difficult---stuff, like writing quality code.
      
    
   
  
     
    Pragmatic Unit Testing (C#) 
    
        Pragmatic programmers use feedback to drive their development and 
        personal processes. The most valuable feedback you can get while 
        coding comes from unit testing.
      
      
        Without good tests in place, coding can become a frustrating game of 
        "whack-a-mole." That's the carnival game where the player strikes at a 
        mechanical mole; it retreats and another mole pops up on the opposite side 
        of the field. The moles pop up and down so fast that you end up flailing 
        your mallet helplessly as the moles continue to pop up where you least 
        expect them.
      
    
   
  
     
    Pragmatic Version Control 
    
         This book is a recipe-based approach to using Subversion that will 
         get you up and running quickly---and correctly. All projects need
         version control: it's a foundational piece of any project's 
         infrastructure. Yet half of all project teams in the U.S. don't use
         any version control at all. Many others don't use it well, and end 
         up experiencing time-consuming problems.
      
    
   
     
   
     
    
    edit app/controllers/store_controller.rb 
      def add_to_cart 
        product = Product.find(params[:id]) 
        @cart = find_cart 
        @cart.add_product(product) 
        redirect_to_index 
      rescue ActiveRecord::RecordNotFound 
        logger.error("Attempt to access invalid product #{params[:id]}") 
        redirect_to_index("Invalid product") 
      end 
    edit app/controllers/store_controller.rb 
      def redirect_to_index(msg = nil) 
        flash[:notice] = msg if msg 
        redirect_to :action => 'index' 
      end 
    rm app/views/store/add_to_cart.html.erb 
    get /store/add_to_cart/3 
    
You are being 
redirected .    
 
    
    get http://127.0.0.1:3000/store 
    
 
  
    
    Pragmatic Bookshelf
  
 
  
    
    
      
            
      Your Pragmatic Catalog 
  
     
    Pragmatic Project Automation 
    
       Pragmatic Project Automation  shows you how to improve the 
       consistency and repeatability of your project's procedures using 
       automation to reduce risk and errors.
      
      
        Simply put, we're going to put this thing called a computer to work 
        for you doing the mundane (but important) project stuff. That means 
        you'll have more time and energy to do the really 
        exciting---and difficult---stuff, like writing quality code.
      
    
   
  
     
    Pragmatic Unit Testing (C#) 
    
        Pragmatic programmers use feedback to drive their development and 
        personal processes. The most valuable feedback you can get while 
        coding comes from unit testing.
      
      
        Without good tests in place, coding can become a frustrating game of 
        "whack-a-mole." That's the carnival game where the player strikes at a 
        mechanical mole; it retreats and another mole pops up on the opposite side 
        of the field. The moles pop up and down so fast that you end up flailing 
        your mallet helplessly as the moles continue to pop up where you least 
        expect them.
      
    
   
  
     
    Pragmatic Version Control 
    
         This book is a recipe-based approach to using Subversion that will 
         get you up and running quickly---and correctly. All projects need
         version control: it's a foundational piece of any project's 
         infrastructure. Yet half of all project teams in the U.S. don't use
         any version control at all. Many others don't use it well, and end 
         up experiencing time-consuming problems.
      
    
   
     
   
     
    
    
      9.2 Iteration D2: Creating an AJAX-Based Cart 
     
    edit app/views/store/index.html.erb 
        <% form_remote_tag :url => { :action => 'add_to_cart', :id => product } do %> 
          <%= submit_tag "Add to Cart" %> 
        <% end %> 
    edit app/views/layouts/store.html.erb 
    <html> 
    <head> 
      <title>Pragprog Books Online Store</title> 
      <%= stylesheet_link_tag "depot", :media => "all" %> 
      <%= javascript_include_tag :defaults %> 
    </head> 
    edit app/controllers/store_controller.rb 
      def add_to_cart 
        product = Product.find(params[:id]) 
        @cart = find_cart 
        @cart.add_product(product) 
        respond_to do |format| 
          format.js 
        end 
      rescue ActiveRecord::RecordNotFound 
        logger.error("Attempt to access invalid product #{params[:id]}") 
        redirect_to_index("Invalid product") 
      end 
    edit app/views/store/add_to_cart.js.rjs 
    page.replace_html("cart", :partial => "cart", :object => @cart) 
    
      9.3 Iteration D3: Highlighting Changes 
     
    edit app/models/cart.rb 
    class Cart 
      attr_reader :items   # <wtf linkend="wtf.attr.accessor">attr_reader</wtf> 
       
      def initialize 
        @items = [] 
      end 
       
      def add_product(product) 
        current_item = @items.find {|item| item.product == product} 
        if current_item 
          current_item.increment_quantity 
        else 
          current_item = CartItem.new(product) 
          @items << current_item  
        end 
        current_item 
      end 
      
      def total_price 
        @items.sum { |item| item.price } 
      end 
    end 
    edit app/controllers/store_controller.rb 
      def add_to_cart 
        product = Product.find(params[:id]) 
        @cart = find_cart 
        @current_item = @cart.add_product(product) 
        respond_to do |format| 
          format.js 
        end 
      rescue ActiveRecord::RecordNotFound 
        logger.error("Attempt to access invalid product #{params[:id]}") 
        redirect_to_index("Invalid product") 
      end 
    edit app/views/store/_cart_item.html.erb 
    <% if cart_item == @current_item %> 
      <tr id="current_item"> 
    <% else %> 
      <tr> 
    <% end %> 
      <td><%= cart_item.quantity %>×</td> 
      <td><%=h cart_item.title %></td> 
      <td class="item-price"><%= number_to_currency(cart_item.price) %></td> 
    </tr> 
    edit app/views/store/add_to_cart.js.rjs 
    page.replace_html("cart", :partial => "cart", :object => @cart) 
     
    page[:current_item].visual_effect :highlight, 
                                      :startcolor => "#88ff88", 
                                      :endcolor => "#114411" 
    
      9.4 Iteration D4: Hide an Empty Cart 
     
    edit app/views/store/add_to_cart.js.rjs 
    page.replace_html("cart", :partial => "cart", :object => @cart) 
      
    page[:cart].visual_effect :blind_down if @cart.total_items == 1 
      
    page[:current_item].visual_effect :highlight, 
                                      :startcolor => "#88ff88", 
                                      :endcolor => "#114411" 
    edit app/models/cart.rb 
    class Cart 
      attr_reader :items   # <wtf linkend="wtf.attr.accessor">attr_reader</wtf> 
       
      def initialize 
        @items = [] 
      end 
       
      def add_product(product) 
        current_item = @items.find {|item| item.product == product} 
        if current_item 
          current_item.increment_quantity 
        else 
          current_item = CartItem.new(product) 
          @items << current_item  
        end 
        current_item 
      end 
      
      def total_price 
        @items.sum { |item| item.price } 
      end 
      
      def total_items 
        @items.sum { |item| item.quantity } 
      end 
    end 
    ls -p app 
    controllers/ 
    helpers/ 
    models/ 
    views/ 
    ls -p app/helpers 
    application_helper.rb 
    products_helper.rb 
    store_helper.rb 
    edit app/views/layouts/store.html.erb 
          <% hidden_div_if(@cart.items.empty?, :id => "cart") do %> 
            <%= render(:partial => "cart", :object => @cart) %> 
          <% end %> 
    edit app/helpers/store_helper.rb 
    module StoreHelper 
      def hidden_div_if(condition, attributes = {}, &block) 
        if condition 
          attributes["style"] = "display: none" 
        end 
        content_tag("div", attributes, &block) 
      end 
    end 
    edit app/controllers/store_controller.rb 
      def empty_cart 
        session[:cart] = nil 
        redirect_to_index 
      end 
    
      9.5 Iteration D5: Degrading If Javascript Is Disabled 
     
    edit app/controllers/store_controller.rb 
      def add_to_cart 
        product = Product.find(params[:id]) 
        @cart = find_cart 
        @current_item = @cart.add_product(product) 
        respond_to do |format| 
          format.js if request.xhr? 
          format.html {redirect_to_index} 
        end 
      rescue ActiveRecord::RecordNotFound 
        logger.error("Attempt to access invalid product #{params[:id]}") 
        redirect_to_index("Invalid product") 
      end 
    get /store/empty_cart 
    
You are being 
redirected .    
 
    
    get http://127.0.0.1:3000/store 
    
 
  
    
    Pragmatic Bookshelf
  
 
  
    
    
      
            
      Your Pragmatic Catalog 
  
     
    Pragmatic Project Automation 
    
       Pragmatic Project Automation  shows you how to improve the 
       consistency and repeatability of your project's procedures using 
       automation to reduce risk and errors.
      
      
        Simply put, we're going to put this thing called a computer to work 
        for you doing the mundane (but important) project stuff. That means 
        you'll have more time and energy to do the really 
        exciting---and difficult---stuff, like writing quality code.
      
    
   
  
     
    Pragmatic Unit Testing (C#) 
    
        Pragmatic programmers use feedback to drive their development and 
        personal processes. The most valuable feedback you can get while 
        coding comes from unit testing.
      
      
        Without good tests in place, coding can become a frustrating game of 
        "whack-a-mole." That's the carnival game where the player strikes at a 
        mechanical mole; it retreats and another mole pops up on the opposite side 
        of the field. The moles pop up and down so fast that you end up flailing 
        your mallet helplessly as the moles continue to pop up where you least 
        expect them.
      
    
   
  
     
    Pragmatic Version Control 
    
         This book is a recipe-based approach to using Subversion that will 
         get you up and running quickly---and correctly. All projects need
         version control: it's a foundational piece of any project's 
         infrastructure. Yet half of all project teams in the U.S. don't use
         any version control at all. Many others don't use it well, and end 
         up experiencing time-consuming problems.
      
    
   
     
   
     
    
    get /store/add_to_cart/3 
    
You are being 
redirected .    
 
    
    get http://127.0.0.1:3000/store 
    
 
  
    
    Pragmatic Bookshelf
  
 
  
    
    
      
            
      Your Pragmatic Catalog 
  
     
    Pragmatic Project Automation 
    
       Pragmatic Project Automation  shows you how to improve the 
       consistency and repeatability of your project's procedures using 
       automation to reduce risk and errors.
      
      
        Simply put, we're going to put this thing called a computer to work 
        for you doing the mundane (but important) project stuff. That means 
        you'll have more time and energy to do the really 
        exciting---and difficult---stuff, like writing quality code.
      
    
   
  
     
    Pragmatic Unit Testing (C#) 
    
        Pragmatic programmers use feedback to drive their development and 
        personal processes. The most valuable feedback you can get while 
        coding comes from unit testing.
      
      
        Without good tests in place, coding can become a frustrating game of 
        "whack-a-mole." That's the carnival game where the player strikes at a 
        mechanical mole; it retreats and another mole pops up on the opposite side 
        of the field. The moles pop up and down so fast that you end up flailing 
        your mallet helplessly as the moles continue to pop up where you least 
        expect them.
      
    
   
  
     
    Pragmatic Version Control 
    
         This book is a recipe-based approach to using Subversion that will 
         get you up and running quickly---and correctly. All projects need
         version control: it's a foundational piece of any project's 
         infrastructure. Yet half of all project teams in the U.S. don't use
         any version control at all. Many others don't use it well, and end 
         up experiencing time-consuming problems.
      
    
   
     
   
     
    
    
      10.1 Iteration E1: Capturing an Order 
     
    ruby script/generate scaffold order name:string address:text email:string pay_type:string 
          exists  app/models/ 
          exists  app/controllers/ 
          exists  app/helpers/ 
          create  app/views/orders 
          exists  app/views/layouts/ 
          exists  test/functional/ 
          exists  test/unit/ 
          exists  test/unit/helpers/ 
          exists  public/stylesheets/ 
          create  app/views/orders/index.html.erb 
          create  app/views/orders/show.html.erb 
          create  app/views/orders/new.html.erb 
          create  app/views/orders/edit.html.erb 
          create  app/views/layouts/orders.html.erb 
       identical  public/stylesheets/scaffold.css 
          create  app/controllers/orders_controller.rb 
          create  test/functional/orders_controller_test.rb 
          create  app/helpers/orders_helper.rb 
          create  test/unit/helpers/orders_helper_test.rb 
           route  map.resources :orders 
      dependency  model 
          exists    app/models/ 
          exists    test/unit/ 
          exists    test/fixtures/ 
          create    app/models/order.rb 
          create    test/unit/order_test.rb 
          create    test/fixtures/orders.yml 
          exists    db/migrate 
          create    db/migrate/20090518123332_create_orders.rb 
    ruby script/generate scaffold line_item product_id:integer order_id:integer quantity:integer total_price:decimal 
          exists  app/models/ 
          exists  app/controllers/ 
          exists  app/helpers/ 
          create  app/views/line_items 
          exists  app/views/layouts/ 
          exists  test/functional/ 
          exists  test/unit/ 
          exists  test/unit/helpers/ 
          exists  public/stylesheets/ 
          create  app/views/line_items/index.html.erb 
          create  app/views/line_items/show.html.erb 
          create  app/views/line_items/new.html.erb 
          create  app/views/line_items/edit.html.erb 
          create  app/views/layouts/line_items.html.erb 
       identical  public/stylesheets/scaffold.css 
          create  app/controllers/line_items_controller.rb 
          create  test/functional/line_items_controller_test.rb 
          create  app/helpers/line_items_helper.rb 
          create  test/unit/helpers/line_items_helper_test.rb 
           route  map.resources :line_items 
      dependency  model 
          exists    app/models/ 
          exists    test/unit/ 
          exists    test/fixtures/ 
          create    app/models/line_item.rb 
          create    test/unit/line_item_test.rb 
          create    test/fixtures/line_items.yml 
          exists    db/migrate 
          create    db/migrate/20090518123333_create_line_items.rb 
    edit db/migrate/20090518123332_create_orders.rb 
      def self.up 
        create_table :orders do |t| 
          t.string :name 
          t.text :address 
          t.string :email 
          t.string :pay_type, :limit => 10 
      
          t.timestamps 
        end 
      end 
    edit db/migrate/20090518123333_create_line_items.rb 
    class CreateLineItems < ActiveRecord::Migration 
      def self.up 
        create_table :line_items do |t| 
          t.integer :product_id,  :null => false, :options => 
            "CONSTRAINT fk_line_item_products REFERENCES products(id)" 
          t.integer :order_id,    :null => false, :options => 
            "CONSTRAINT fk_line_item_orders REFERENCES orders(id)" 
          t.integer :quantity,    :null => false 
          t.decimal :total_price, :null => false, :precision => 8, :scale => 2 
      
          t.timestamps 
        end 
      end 
      
      def self.down 
        drop_table :line_items 
      end 
    end 
    rake db:migrate 
    mv 20090518123332_create_orders.rb 20080601000005_create_orders.rb 
    mv 20090518123333_create_line_items.rb 20080601000006_create_line_items.rb 
    (in /home/rubys/git/awdwr/work/depot) 
    ==  CreateOrders: migrating =================================================== 
    -- create_table(:orders) 
       -> 0.0017s 
    ==  CreateOrders: migrated (0.0018s) ========================================== 
      
    ==  CreateLineItems: migrating ================================================ 
    -- create_table(:line_items) 
       -> 0.0028s 
    ==  CreateLineItems: migrated (0.0029s) ======================================= 
      
    sqlite3 db/development.sqlite3 .schema 
    CREATE TABLE "line_items" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "product_id" integer NOT NULL, "order_id" integer NOT NULL, "quantity" integer NOT NULL, "total_price" decimal(8,2) NOT NULL, "created_at" datetime, "updated_at" datetime); 
    CREATE TABLE "orders" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "name" varchar(255), "address" text, "email" varchar(255), "pay_type" varchar(10), "created_at" datetime, "updated_at" datetime); 
    CREATE TABLE "products" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "title" varchar(255), "description" text, "image_url" varchar(255), "created_at" datetime, "updated_at" datetime, "price" decimal(8,2) DEFAULT 0); 
    CREATE TABLE "schema_migrations" ("version" varchar(255) NOT NULL); 
    CREATE TABLE "sessions" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "session_id" varchar(255) NOT NULL, "data" text, "created_at" datetime, "updated_at" datetime); 
    CREATE INDEX "index_sessions_on_session_id" ON "sessions" ("session_id"); 
    CREATE INDEX "index_sessions_on_updated_at" ON "sessions" ("updated_at"); 
    CREATE UNIQUE INDEX "unique_schema_migrations" ON "schema_migrations" ("version"); 
    edit app/models/order.rb 
    class Order < ActiveRecord::Base 
      has_many :line_items 
    end 
    edit app/models/product.rb 
    class Product < ActiveRecord::Base 
      has_many :line_items 
      # ... 
    edit app/models/line_item.rb 
    class LineItem < ActiveRecord::Base 
      belongs_to :order 
      belongs_to :product 
    end 
    edit app/views/store/_cart.html.erb 
    <div class="cart-title">Your Cart</div> 
    <table> 
      <%= render(:partial => "cart_item", :collection => cart.items) %>   
       
      <tr class="total-line"> 
        <td colspan="2">Total</td> 
        <td class="total-cell"><%= number_to_currency(cart.total_price) %></td> 
      </tr> 
      
    </table> 
       
    <%= button_to "Checkout", :action => 'checkout' %> 
    <%= button_to "Empty cart", :action => :empty_cart %> 
    edit app/controllers/store_controller.rb 
      def checkout 
        @cart = find_cart 
        if @cart.items.empty? 
          redirect_to_index("Your cart is empty") 
        else 
          @order = Order.new 
        end 
      end 
    edit app/views/store/checkout.html.erb 
    <div class="depot-form"> 
       
      <%= error_messages_for 'order' %> 
       
      <% form_for :order, :url => { :action => :save_order } do |form| %> 
        <fieldset> 
          <legend>Please Enter Your Details</legend> 
     
          <div> 
            <%= form.label :name, "Name:" %> 
            <%= form.text_field :name, :size => 40 %> 
          </div> 
     
          <div> 
            <%= form.label :address, "Address:" %> 
            <%= form.text_area :address, :rows => 3, :cols => 40 %> 
          </div> 
     
          <div> 
            <%= form.label :email, "E-Mail:" %> 
            <%= form.text_field :email, :size => 40 %> 
          </div> 
     
          <div> 
            <%= form.label :pay_type, "Pay with:" %> 
            <%= 
              form.select :pay_type, 
                           Order::PAYMENT_TYPES,  
                          :prompt => "Select a payment method" 
            %> 
          </div> 
         
          <%= submit_tag "Place Order", :class => "submit" %> 
        </fieldset> 
      <% end %>   
    </div> 
    edit app/models/order.rb 
    class Order < ActiveRecord::Base 
      PAYMENT_TYPES = [ 
        #  Displayed       stored in db 
        [ "Check",          "check" ], 
        [ "Credit card",    "cc" ], 
        [ "Purchase order", "po" ] 
      ] 
     
      # ... 
    edit public/stylesheets/depot.css 
    /* Styles for order form */ 
      
    .depot-form fieldset { 
      background: #efe; 
    } 
      
    .depot-form legend { 
      color: #dfd; 
      background: #141; 
      font-family: sans-serif; 
      padding: 0.2em 1em; 
    } 
      
    .depot-form label { 
      width: 5em; 
      float: left; 
      text-align: right; 
      padding-top: 0.2em; 
      margin-right: 0.1em; 
      display: block; 
    } 
      
    .depot-form select, .depot-form textarea, .depot-form input { 
      margin-left: 0.5em; 
    } 
      
    .depot-form .submit { 
      margin-left: 4em; 
    } 
      
    .depot-form div { 
      margin: 0.5em 0; 
    } 
    get /store/checkout 
    
 
  
    
    Pragmatic Bookshelf
  
 
  
     
    
    get /store/save_order 
    
Unknown action 
No action responded to save_order. Actions: add_to_cart, checkout, empty_cart, and index
     
    
    edit app/models/order.rb 
    class Order < ActiveRecord::Base 
      PAYMENT_TYPES = [ 
        #  Displayed       stored in db 
        [ "Check",          "check" ], 
        [ "Credit card",    "cc" ], 
        [ "Purchase order", "po" ] 
      ] 
      
      validates_presence_of :name, :address, :email, :pay_type 
      validates_inclusion_of :pay_type, :in =>  
        PAYMENT_TYPES.map {|disp, value| value} 
      
      # ... 
    edit app/controllers/store_controller.rb 
      def save_order 
        @cart = find_cart 
        @order = Order.new(params[:order]) # <label id="code.p.new.order"/> 
        @order.add_line_items_from_cart(@cart) # <label id="code.p.append.li"/> 
        if @order.save                     # <label id="code.p.save"/> 
          session[:cart] = nil 
          redirect_to_index("Thank you for your order") 
        else 
          render :action => 'checkout' 
        end 
      end 
    edit app/models/order.rb 
    class Order < ActiveRecord::Base 
      PAYMENT_TYPES = [ 
        #  Displayed       stored in db 
        [ "Check",          "check" ], 
        [ "Credit card",    "cc" ], 
        [ "Purchase order", "po" ] 
      ] 
      
      # ... 
      validates_presence_of :name, :address, :email, :pay_type 
      validates_inclusion_of :pay_type, :in =>  
        PAYMENT_TYPES.map {|disp, value| value} 
      
      # ... 
      
      
      has_many :line_items 
      
      def add_line_items_from_cart(cart) 
        cart.items.each do |item| 
          li = LineItem.from_cart_item(item) 
          line_items << li 
        end 
      end 
    end 
    edit app/models/line_item.rb 
    class LineItem < ActiveRecord::Base 
      belongs_to :order 
      belongs_to :product 
      
      def self.from_cart_item(cart_item) 
        li = self.new 
        li.product     = cart_item.product 
        li.quantity    = cart_item.quantity 
        li.total_price = cart_item.price 
        li 
      end 
      
    end 
    sqlite3> select * from orders 
    sqlite3> select * from line_items 
    get /store/save_order 
    
 
  
    
    Pragmatic Bookshelf
  
 
  
     
    
    get /store/checkout 
    
 
  
    
    Pragmatic Bookshelf
  
 
  
     
    
    post /store/save_order 
    
      order[pay_type] => check 
      order[address] => 123 Main St 
      order[email] => customer@pragprog.com 
      order[name] => Dave Thomas 
     
    
You are being 
redirected .    
 
    
    get http://127.0.0.1:3000/store 
    
 
  
    
    Pragmatic Bookshelf
  
 
  
    
    
      
              Thank you for your order
            
      Your Pragmatic Catalog 
  
     
    Pragmatic Project Automation 
    
       Pragmatic Project Automation  shows you how to improve the 
       consistency and repeatability of your project's procedures using 
       automation to reduce risk and errors.
      
      
        Simply put, we're going to put this thing called a computer to work 
        for you doing the mundane (but important) project stuff. That means 
        you'll have more time and energy to do the really 
        exciting---and difficult---stuff, like writing quality code.
      
    
   
  
     
    Pragmatic Unit Testing (C#) 
    
        Pragmatic programmers use feedback to drive their development and 
        personal processes. The most valuable feedback you can get while 
        coding comes from unit testing.
      
      
        Without good tests in place, coding can become a frustrating game of 
        "whack-a-mole." That's the carnival game where the player strikes at a 
        mechanical mole; it retreats and another mole pops up on the opposite side 
        of the field. The moles pop up and down so fast that you end up flailing 
        your mallet helplessly as the moles continue to pop up where you least 
        expect them.
      
    
   
  
     
    Pragmatic Version Control 
    
         This book is a recipe-based approach to using Subversion that will 
         get you up and running quickly---and correctly. All projects need
         version control: it's a foundational piece of any project's 
         infrastructure. Yet half of all project teams in the U.S. don't use
         any version control at all. Many others don't use it well, and end 
         up experiencing time-consuming problems.
      
    
   
     
   
     
    
    sqlite3> select * from orders 
            id = 1 
          name = Dave Thomas 
       address = 123 Main St 
         email = customer@pragprog.com 
      pay_type = check 
    created_at = 2009-05-18 12:33:36.757790 
    updated_at = 2009-05-18 12:33:36.757790 
    sqlite3> select * from line_items 
             id = 1 
     product_id = 3 
       order_id = 1 
       quantity = 1 
    total_price = 28.5 
     created_at = 2009-05-18 12:33:36.759832 
     updated_at = 2009-05-18 12:33:36.759832 
    edit app/views/store/add_to_cart.js.rjs 
    page.select("div#notice").each { |div| div.hide } 
      
    page.replace_html("cart", :partial => "cart", :object => @cart) 
      
    page[:cart].visual_effect :blind_down if @cart.total_items == 1 
      
    page[:current_item].visual_effect :highlight, 
                                      :startcolor => "#88ff88", 
                                      :endcolor => "#114411" 
    
      11.1 Iteration F1: Adding Users 
     
    ruby script/generate scaffold user name:string hashed_password:string salt:string 
          exists  app/models/ 
          exists  app/controllers/ 
          exists  app/helpers/ 
          create  app/views/users 
          exists  app/views/layouts/ 
          exists  test/functional/ 
          exists  test/unit/ 
          exists  test/unit/helpers/ 
          exists  public/stylesheets/ 
          create  app/views/users/index.html.erb 
          create  app/views/users/show.html.erb 
          create  app/views/users/new.html.erb 
          create  app/views/users/edit.html.erb 
          create  app/views/layouts/users.html.erb 
       identical  public/stylesheets/scaffold.css 
          create  app/controllers/users_controller.rb 
          create  test/functional/users_controller_test.rb 
          create  app/helpers/users_helper.rb 
          create  test/unit/helpers/users_helper_test.rb 
           route  map.resources :users 
      dependency  model 
          exists    app/models/ 
          exists    test/unit/ 
          exists    test/fixtures/ 
          create    app/models/user.rb 
          create    test/unit/user_test.rb 
          create    test/fixtures/users.yml 
          exists    db/migrate 
          create    db/migrate/20090518123338_create_users.rb 
    restart 
    cat db/migrate/20090518123338_create_users.rb 
    class CreateUsers < ActiveRecord::Migration 
      def self.up 
        create_table :users do |t| 
          t.string :name 
          t.string :hashed_password 
          t.string :salt 
      
          t.timestamps 
        end 
      end 
      
      def self.down 
        drop_table :users 
      end 
    end 
    rake db:migrate 
    mv 20090518123338_create_users.rb 20080601000007_create_users.rb 
    (in /home/rubys/git/awdwr/work/depot) 
    ==  CreateUsers: migrating ==================================================== 
    -- create_table(:users) 
       -> 0.0017s 
    ==  CreateUsers: migrated (0.0018s) =========================================== 
      
    edit app/models/user.rb 
    require 'digest/sha1' 
     
    class User < ActiveRecord::Base 
       
      validates_presence_of     :name 
      validates_uniqueness_of   :name 
      
      attr_accessor :password_confirmation 
      validates_confirmation_of :password 
     
      validate :password_non_blank 
       
      def self.authenticate(name, password) 
        user = self.find_by_name(name) 
        if user 
          expected_password = encrypted_password(password, user.salt) 
          if user.hashed_password != expected_password 
            user = nil 
          end 
        end 
        user 
      end 
       
      # 'password' is a virtual attribute 
      def password 
        @password 
      end 
       
      def password=(pwd) 
        @password = pwd 
        return if pwd.blank? 
        create_new_salt 
        self.hashed_password = User.encrypted_password(self.password, self.salt) 
      end 
       
    private 
     
      def password_non_blank 
        errors.add(:password, "Missing password") if hashed_password.blank? 
      end 
       
      def create_new_salt 
        self.salt = self.object_id.to_s + rand.to_s 
      end 
       
      def self.encrypted_password(password, salt) 
        string_to_hash = password + "wibble" + salt 
        Digest::SHA1.hexdigest(string_to_hash) 
      end 
    end 
    edit app/controllers/users_controller.rb 
    class UsersController < ApplicationController 
      # GET /users 
      # GET /users.xml 
      def index 
        @users = User.all(:order => :name) 
      
        respond_to do |format| 
          format.html # index.html.erb 
          format.xml  { render :xml => @users } 
        end 
      end 
      
      # GET /users/1 
      # GET /users/1.xml 
      def show 
        @user = User.find(params[:id]) 
      
        respond_to do |format| 
          format.html # show.html.erb 
          format.xml  { render :xml => @user } 
        end 
      end 
      
      # GET /users/new 
      # GET /users/new.xml 
      def new 
        @user = User.new 
      
        respond_to do |format| 
          format.html # new.html.erb 
          format.xml  { render :xml => @user } 
        end 
      end 
      
      # GET /users/1/edit 
      def edit 
        @user = User.find(params[:id]) 
      end 
      
      # POST /users 
      # POST /users.xml 
      def create 
        @user = User.new(params[:user]) 
      
        respond_to do |format| 
          if @user.save 
            flash[:notice] = "User #{@user.name} was successfully created." 
            format.html { redirect_to(:action=>'index') } 
            format.xml  { render :xml => @user, :status => :created, 
                                 :location => @user } 
          else 
            format.html { render :action => "new" } 
            format.xml  { render :xml => @user.errors, 
                                 :status => :unprocessable_entity } 
          end 
        end 
      end 
      
      # PUT /users/1 
      # PUT /users/1.xml 
      def update 
        @user = User.find(params[:id]) 
      
        respond_to do |format| 
          if @user.update_attributes(params[:user]) 
            flash[:notice] = "User #{@user.name} was successfully updated." 
            format.html { redirect_to(:action=>'index') } 
            format.xml  { head :ok } 
          else 
            format.html { render :action => "edit" } 
            format.xml  { render :xml => @user.errors, 
                                 :status => :unprocessable_entity } 
          end 
        end 
      end 
      
      # DELETE /users/1 
      # DELETE /users/1.xml 
      def destroy 
        @user = User.find(params[:id]) 
        @user.destroy 
      
        respond_to do |format| 
          format.html { redirect_to(users_url) } 
          format.xml  { head :ok } 
        end 
      end 
    end 
    edit app/views/users/index.html.erb 
    <h1>Listing users</h1> 
      
    <table> 
      <tr> 
        <th>Name</th> 
      </tr> 
      
    <% @users.each do |user| %> 
      <tr> 
        <td><%=h user.name %></td> 
        <td><%= link_to 'Show', user %></td> 
        <td><%= link_to 'Edit', edit_user_path(user) %></td> 
        <td><%= link_to 'Destroy', user, :confirm => 'Are you sure?', 
                                            :method => :delete %></td> 
      </tr> 
    <% end %> 
    </table> 
      
    <br /> 
      
    <%= link_to 'New user', new_user_path %> 
    edit app/views/users/new.html.erb 
    <div class="depot-form"> 
      
    <% form_for(@user) do |f| %> 
      <%= f.error_messages %> 
      
      <fieldset> 
      <legend>Enter User Details</legend> 
      
      <div> 
        <%= f.label :name %>: 
        <%= f.text_field :name, :size => 40 %> 
      </div> 
      
      <div> 
        <%= f.label :password, 'Password' %>: 
        <%= f.password_field :password, :size => 40 %> 
      </div> 
      
      <div> 
        <%= f.label :password_confirmation, 'Confirm' %>: 
        <%= f.password_field :password_confirmation, :size => 40 %> 
      </div> 
      
      <div> 
        <%= f.submit "Add User", :class => "submit" %> 
      </div> 
      
      </fieldset> 
    <% end %> 
      
    </div> 
    edit app/views/layouts/users.html.erb 
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
           "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
      
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> 
    <head> 
      <meta http-equiv="content-type" content="text/html;charset=UTF-8" /> 
      <title>Users: <%= controller.action_name %></title> 
      <%= stylesheet_link_tag 'scaffold', 'depot' %> 
    </head> 
    get /users 
    
    
    get /users/new 
    
    
    post /users 
    
      user[password_confirmation] => secret 
      user[name] => dave 
      user[password] => secret 
     
    
You are being 
redirected .    
 
    
    get http://127.0.0.1:3000/users 
    
 
User dave was successfully created.
Listing users 
New user 
     
    
    sqlite3> select * from users 
                 id = 1 
               name = dave 
    hashed_password = 9e5af0473230fcb1cdde8552fcfb40fc87fe3d9e 
               salt = -6146827180.76659407232305 
         created_at = 2009-05-18 12:33:48.478621 
         updated_at = 2009-05-18 12:33:48.478621 
    
      11.2 Iteration F2: Logging in 
     
    ruby script/generate controller admin login logout index 
          exists  app/controllers/ 
          exists  app/helpers/ 
          create  app/views/admin 
          exists  test/functional/ 
          exists  test/unit/helpers/ 
          create  app/controllers/admin_controller.rb 
          create  test/functional/admin_controller_test.rb 
          create  app/helpers/admin_helper.rb 
          create  test/unit/helpers/admin_helper_test.rb 
          create  app/views/admin/login.html.erb 
          create  app/views/admin/logout.html.erb 
          create  app/views/admin/index.html.erb 
    restart 
    edit app/controllers/admin_controller.rb 
    class AdminController < ApplicationController 
      
      # just display the form and wait for user to 
      # enter a name and password 
      def login 
        if request.post? 
          user = User.authenticate(params[:name], params[:password]) 
          if user 
            session[:user_id] = user.id 
            redirect_to(:action => "index") 
          else 
            flash.now[:notice] = "Invalid user/password combination" 
          end 
        end 
      end 
      
      def logout 
        session[:user_id] = nil 
        flash[:notice] = "Logged out" 
        redirect_to(:action => "login") 
      end 
      
      def index 
        @total_orders = Order.count 
      end 
    end 
    edit app/views/admin/login.html.erb 
    <div class="depot-form"> 
      <% form_tag do %> 
        <fieldset> 
          <legend>Please Log In</legend> 
     
          <div> 
            <label for="name">Name:</label> 
            <%= text_field_tag :name, params[:name] %> 
          </div> 
     
          <div> 
            <label for="password">Password:</label> 
            <%= password_field_tag :password, params[:password] %> 
          </div> 
       
          <div> 
            <%= submit_tag "Login" %> 
          </div> 
        </fieldset> 
      <% end %> 
    </div> 
    edit app/views/admin/index.html.erb 
    <h1>Welcome</h1> 
     
    It's <%= Time.now %> 
    We have <%= pluralize(@total_orders, "order") %>. 
    get /admin/login 
    
    
    post /admin/login 
    
      name => dave 
      password => secret 
     
    
You are being 
redirected .    
 
    
    get http://127.0.0.1:3000/admin 
    
Welcome 
It's Mon May 18 08:33:57 -0400 2009
We have 1 order.
    
    
    
      11.3 Iteration F3: Limiting Access 
     
    edit app/controllers/application_controller.rb 
    # Filters added to this controller apply to all controllers in the application. 
    # Likewise, all the methods added will be available for all controllers. 
      
    class ApplicationController < ActionController::Base 
      before_filter :authorize, :except => :login 
      helper :all # include all helpers, all the time 
      protect_from_forgery # See ActionController::RequestForgeryProtection for details 
      
      # Scrub sensitive parameters from your log 
      # filter_parameter_logging :password 
         
    protected 
      def authorize 
        unless User.find_by_id(session[:user_id]) 
          flash[:notice] = "Please log in" 
          redirect_to :controller => 'admin', :action => 'login' 
        end 
      end 
    end 
    edit app/controllers/store_controller.rb 
    class StoreController < ApplicationController 
      def index 
        @products = Product.find_products_for_sale 
        @cart = find_cart 
      end 
      
      
      def add_to_cart 
        product = Product.find(params[:id]) 
        @cart = find_cart 
        @current_item = @cart.add_product(product) 
        respond_to do |format| 
          format.js if request.xhr? 
          format.html {redirect_to_index} 
        end 
      rescue ActiveRecord::RecordNotFound 
        logger.error("Attempt to access invalid product #{params[:id]}") 
        redirect_to_index("Invalid product") 
      end 
      
      def checkout 
        @cart = find_cart 
        if @cart.items.empty? 
          redirect_to_index("Your cart is empty") 
        else 
          @order = Order.new 
        end 
      end 
      
      def save_order 
        @cart = find_cart 
        @order = Order.new(params[:order]) 
        @order.add_line_items_from_cart(@cart) 
        if @order.save 
          session[:cart] = nil 
          redirect_to_index("Thank you for your order") 
        else 
          render :action => 'checkout' 
        end 
      end 
      
      def empty_cart 
        session[:cart] = nil 
        redirect_to_index 
      end 
      
    private 
      
      def redirect_to_index(msg = nil) 
        flash[:notice] = msg if msg 
        redirect_to :action => 'index' 
      end 
      
      def find_cart 
        session[:cart] ||= Cart.new 
      end 
      
    end 
    edit app/controllers/store_controller.rb 
    class StoreController < ApplicationController 
      #... 
    protected 
      
      def authorize 
      end 
    end 
    rake db:sessions:clear 
    (in /home/rubys/git/awdwr/work/depot) 
    get /admin/logout 
    
You are being 
redirected .    
 
    
    get http://127.0.0.1:3000/admin/login 
    
    
    get /store 
    
 
  
    
    Pragmatic Bookshelf
  
 
  
    
    
      
              Please log in
            
      Your Pragmatic Catalog 
  
     
    Pragmatic Project Automation 
    
       Pragmatic Project Automation  shows you how to improve the 
       consistency and repeatability of your project's procedures using 
       automation to reduce risk and errors.
      
      
        Simply put, we're going to put this thing called a computer to work 
        for you doing the mundane (but important) project stuff. That means 
        you'll have more time and energy to do the really 
        exciting---and difficult---stuff, like writing quality code.
      
    
   
  
     
    Pragmatic Unit Testing (C#) 
    
        Pragmatic programmers use feedback to drive their development and 
        personal processes. The most valuable feedback you can get while 
        coding comes from unit testing.
      
      
        Without good tests in place, coding can become a frustrating game of 
        "whack-a-mole." That's the carnival game where the player strikes at a 
        mechanical mole; it retreats and another mole pops up on the opposite side 
        of the field. The moles pop up and down so fast that you end up flailing 
        your mallet helplessly as the moles continue to pop up where you least 
        expect them.
      
    
   
  
     
    Pragmatic Version Control 
    
         This book is a recipe-based approach to using Subversion that will 
         get you up and running quickly---and correctly. All projects need
         version control: it's a foundational piece of any project's 
         infrastructure. Yet half of all project teams in the U.S. don't use
         any version control at all. Many others don't use it well, and end 
         up experiencing time-consuming problems.
      
    
   
     
   
     
    
    get /products 
    
You are being 
redirected .    
 
    
    get http://127.0.0.1:3000/admin/login 
    
    
    get /admin/login 
    
    
    post /admin/login 
    
      name => dave 
      password => secret 
     
    
You are being 
redirected .    
 
    
    get http://127.0.0.1:3000/admin 
    
Welcome 
It's Mon May 18 08:34:00 -0400 2009
We have 1 order.
    
    
    get /products 
    
    
    
      11.4 Iteration F4: Adding a Sidebar, More Administration 
     
    edit app/controllers/application_controller.rb 
    class ApplicationController < ActionController::Base 
      layout "store" 
      #... 
    get /admin 
    
      <html xmlns="http://www.w3.org/1999/xhtml"> 
      <head> 
        <title>Action Controller: Exception caught</title> 
        <style> 
          body { background-color: #fff; color: #333; } 
       
          body, p, ol, ul, td { 
            font-family: verdana, arial, helvetica, sans-serif; 
            font-size:   13px; 
            line-height: 18px; 
          } 
       
          pre { 
            background-color: #eee; 
            padding: 10px; 
            font-size: 11px; 
          } 
       
          a { color: #000; } 
          a:visited { color: #666; } 
          a:hover { color: #fff; background-color:#000; } 
        </style> 
      </head> 
      <body> 
       
      <h1> 
        NoMethodError in 
        Admin#index 
      </h1> 
       
      <p> 
        Showing <i>/home/rubys/git/awdwr/work/depot/app/views/layouts/store.html.erb</i> where line <b>#24</b> raised: 
        <pre><code>You have a nil object when you didn't expect it! 
      The error occurred while evaluating nil.items</code></pre> 
      </p> 
       
      <p>Extracted source (around line <b>#24</b>): 
      <pre><code>21:     <div id="side"> 
      22:       <!-- START_HIGHLIGHT --> 
      23:       <!-- START:hidden_div --> 
      24:       <% hidden_div_if(@cart.items.empty?, :id => "cart") do %> 
      25:         <%= render(:partial => "cart", :object => @cart) %> 
      26:       <% end %> 
      27:     <!-- END:hidden_div --> 
      </code></pre></p> 
       
      <p></p> 
       
       
       
       
      <p><code>RAILS_ROOT: /home/rubys/git/awdwr/work/depot</code></p> 
       
      <div id="traces"> 
         
           
          <a href="#" onclick="document.getElementById('Framework-Trace').style.display='none';document.getElementById('Full-Trace').style.display='none';document.getElementById('Application-Trace').style.display='block';; return false;">Application Trace</a> | 
         
           
          <a href="#" onclick="document.getElementById('Application-Trace').style.display='none';document.getElementById('Full-Trace').style.display='none';document.getElementById('Framework-Trace').style.display='block';; return false;">Framework Trace</a> | 
         
           
          <a href="#" onclick="document.getElementById('Application-Trace').style.display='none';document.getElementById('Framework-Trace').style.display='none';document.getElementById('Full-Trace').style.display='block';; return false;">Full Trace</a>  
         
       
         
          <div id="Application-Trace" style="display: block;"> 
            <pre><code>/home/rubys/git/awdwr/work/depot/app/views/layouts/store.html.erb:24:in `_render_template_200425620__615886918_0' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_view/template/template.rb:21:in `send' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_view/template/template.rb:21:in `render' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_view/render/rendering.rb:69:in `_render_template' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_view/base.rb:261:in `with_template' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_view/render/rendering.rb:65:in `_render_template' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_view/render/rendering.rb:58:in `_render_content_with_layout' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_view/render/rendering.rb:117:in `_render_template_with_layout' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/render.rb:391:in `render_for_parts' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/render.rb:278:in `render_without_benchmark' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/chained/benchmarking.rb:51:in `render' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/activesupport/lib/active_support/core_ext/benchmark.rb:17:in `ms' 
      /usr/lib/ruby/1.8/benchmark.rb:308:in `realtime' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/activesupport/lib/active_support/core_ext/benchmark.rb:17:in `ms' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/chained/benchmarking.rb:51:in `render' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:864:in `default_render' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:874:in `perform_action_without_filters' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/chained/filters.rb:612:in `call_filters' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/chained/filters.rb:605:in `perform_action_without_benchmark' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/chained/benchmarking.rb:68:in `perform_action_without_rescue' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/activesupport/lib/active_support/core_ext/benchmark.rb:17:in `ms' 
      /usr/lib/ruby/1.8/benchmark.rb:308:in `realtime' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/activesupport/lib/active_support/core_ext/benchmark.rb:17:in `ms' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/chained/benchmarking.rb:68:in `perform_action_without_rescue' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/rescue.rb:45:in `perform_action_without_flash' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/chained/flash.rb:141:in `perform_action' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:530:in `send' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:530:in `process_without_filters' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/chained/filters.rb:601:in `process' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:374:in `action' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:382:in `action' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/routing/route_set.rb:433:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/routing/route_set.rb:433:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/head.rb:9:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/methodoverride.rb:24:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/middleware/params_parser.rb:17:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/middleware/session/abstract_store.rb:144:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/activerecord/lib/active_record/query_cache.rb:29:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/activerecord/lib/active_record/connection_adapters/abstract/query_cache.rb:34:in `cache' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/activerecord/lib/active_record/query_cache.rb:9:in `cache' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/activerecord/lib/active_record/query_cache.rb:28:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/activerecord/lib/active_record/connection_adapters/abstract/connection_pool.rb:363:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/middleware/rescue.rb:8:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/middleware/callbacks.rb:35:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/middleware/show_exceptions.rb:41:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/lock.rb:11:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/lock.rb:11:in `synchronize' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/lock.rb:11:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/railties/lib/rails/rack/static.rb:31:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/urlmap.rb:46:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/urlmap.rb:40:in `each' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/urlmap.rb:40:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/railties/lib/rails/rack/log_tailer.rb:17:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/content_length.rb:13:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/handler/webrick.rb:46:in `service' 
      /usr/lib/ruby/1.8/webrick/httpserver.rb:104:in `service' 
      /usr/lib/ruby/1.8/webrick/httpserver.rb:65:in `run' 
      /usr/lib/ruby/1.8/webrick/server.rb:173:in `start_thread' 
      /usr/lib/ruby/1.8/webrick/server.rb:162:in `start' 
      /usr/lib/ruby/1.8/webrick/server.rb:162:in `start_thread' 
      /usr/lib/ruby/1.8/webrick/server.rb:95:in `start' 
      /usr/lib/ruby/1.8/webrick/server.rb:92:in `each' 
      /usr/lib/ruby/1.8/webrick/server.rb:92:in `start' 
      /usr/lib/ruby/1.8/webrick/server.rb:23:in `start' 
      /usr/lib/ruby/1.8/webrick/server.rb:82:in `start' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/handler/webrick.rb:13:in `run' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/railties/lib/commands/server.rb:110 
      /usr/local/lib/site_ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require' 
      /usr/local/lib/site_ruby/1.8/rubygems/custom_require.rb:31:in `require' 
      makedepot.rb:2272:in `restart_server' 
      makedepot.rb:999 
      makedepot.rb:2351:in `call' 
      makedepot.rb:2351 
      makedepot.rb:2347:in `each' 
      makedepot.rb:2347 
      makedepot.rb:2310 
      makedepot.rb:2283</code></pre> 
          </div> 
         
          <div id="Framework-Trace" style="display: none;"> 
            <pre><code>/home/rubys/git/awdwr/work/depot/app/views/layouts/store.html.erb:24:in `_render_template_200425620__615886918_0' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_view/template/template.rb:21:in `send' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_view/template/template.rb:21:in `render' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_view/render/rendering.rb:69:in `_render_template' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_view/base.rb:261:in `with_template' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_view/render/rendering.rb:65:in `_render_template' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_view/render/rendering.rb:58:in `_render_content_with_layout' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_view/render/rendering.rb:117:in `_render_template_with_layout' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/render.rb:391:in `render_for_parts' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/render.rb:278:in `render_without_benchmark' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/chained/benchmarking.rb:51:in `render' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/activesupport/lib/active_support/core_ext/benchmark.rb:17:in `ms' 
      /usr/lib/ruby/1.8/benchmark.rb:308:in `realtime' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/activesupport/lib/active_support/core_ext/benchmark.rb:17:in `ms' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/chained/benchmarking.rb:51:in `render' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:864:in `default_render' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:874:in `perform_action_without_filters' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/chained/filters.rb:612:in `call_filters' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/chained/filters.rb:605:in `perform_action_without_benchmark' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/chained/benchmarking.rb:68:in `perform_action_without_rescue' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/activesupport/lib/active_support/core_ext/benchmark.rb:17:in `ms' 
      /usr/lib/ruby/1.8/benchmark.rb:308:in `realtime' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/activesupport/lib/active_support/core_ext/benchmark.rb:17:in `ms' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/chained/benchmarking.rb:68:in `perform_action_without_rescue' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/rescue.rb:45:in `perform_action_without_flash' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/chained/flash.rb:141:in `perform_action' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:530:in `send' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:530:in `process_without_filters' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/chained/filters.rb:601:in `process' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:374:in `action' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:382:in `action' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/routing/route_set.rb:433:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/routing/route_set.rb:433:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/head.rb:9:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/methodoverride.rb:24:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/middleware/params_parser.rb:17:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/middleware/session/abstract_store.rb:144:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/activerecord/lib/active_record/query_cache.rb:29:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/activerecord/lib/active_record/connection_adapters/abstract/query_cache.rb:34:in `cache' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/activerecord/lib/active_record/query_cache.rb:9:in `cache' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/activerecord/lib/active_record/query_cache.rb:28:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/activerecord/lib/active_record/connection_adapters/abstract/connection_pool.rb:363:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/middleware/rescue.rb:8:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/middleware/callbacks.rb:35:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/middleware/show_exceptions.rb:41:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/lock.rb:11:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/lock.rb:11:in `synchronize' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/lock.rb:11:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/railties/lib/rails/rack/static.rb:31:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/urlmap.rb:46:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/urlmap.rb:40:in `each' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/urlmap.rb:40:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/railties/lib/rails/rack/log_tailer.rb:17:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/content_length.rb:13:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/handler/webrick.rb:46:in `service' 
      /usr/lib/ruby/1.8/webrick/httpserver.rb:104:in `service' 
      /usr/lib/ruby/1.8/webrick/httpserver.rb:65:in `run' 
      /usr/lib/ruby/1.8/webrick/server.rb:173:in `start_thread' 
      /usr/lib/ruby/1.8/webrick/server.rb:162:in `start' 
      /usr/lib/ruby/1.8/webrick/server.rb:162:in `start_thread' 
      /usr/lib/ruby/1.8/webrick/server.rb:95:in `start' 
      /usr/lib/ruby/1.8/webrick/server.rb:92:in `each' 
      /usr/lib/ruby/1.8/webrick/server.rb:92:in `start' 
      /usr/lib/ruby/1.8/webrick/server.rb:23:in `start' 
      /usr/lib/ruby/1.8/webrick/server.rb:82:in `start' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/handler/webrick.rb:13:in `run' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/railties/lib/commands/server.rb:110 
      /usr/local/lib/site_ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require' 
      /usr/local/lib/site_ruby/1.8/rubygems/custom_require.rb:31:in `require' 
      /usr/lib/ruby/1.8/builder/xmlbase.rb:133:in `call' 
      /usr/lib/ruby/1.8/builder/xmlbase.rb:133:in `_nested_structures' 
      /usr/lib/ruby/1.8/builder/xmlbase.rb:57:in `method_missing' 
      /usr/lib/ruby/1.8/builder/xmlbase.rb:133:in `call' 
      /usr/lib/ruby/1.8/builder/xmlbase.rb:133:in `_nested_structures' 
      /usr/lib/ruby/1.8/builder/xmlbase.rb:57:in `method_missing'</code></pre> 
          </div> 
         
          <div id="Full-Trace" style="display: none;"> 
            <pre><code>/home/rubys/git/awdwr/work/depot/app/views/layouts/store.html.erb:24:in `_render_template_200425620__615886918_0' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_view/template/template.rb:21:in `send' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_view/template/template.rb:21:in `render' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_view/render/rendering.rb:69:in `_render_template' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_view/base.rb:261:in `with_template' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_view/render/rendering.rb:65:in `_render_template' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_view/render/rendering.rb:58:in `_render_content_with_layout' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_view/render/rendering.rb:117:in `_render_template_with_layout' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/render.rb:391:in `render_for_parts' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/render.rb:278:in `render_without_benchmark' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/chained/benchmarking.rb:51:in `render' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/activesupport/lib/active_support/core_ext/benchmark.rb:17:in `ms' 
      /usr/lib/ruby/1.8/benchmark.rb:308:in `realtime' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/activesupport/lib/active_support/core_ext/benchmark.rb:17:in `ms' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/chained/benchmarking.rb:51:in `render' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:864:in `default_render' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:874:in `perform_action_without_filters' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/chained/filters.rb:612:in `call_filters' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/chained/filters.rb:605:in `perform_action_without_benchmark' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/chained/benchmarking.rb:68:in `perform_action_without_rescue' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/activesupport/lib/active_support/core_ext/benchmark.rb:17:in `ms' 
      /usr/lib/ruby/1.8/benchmark.rb:308:in `realtime' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/activesupport/lib/active_support/core_ext/benchmark.rb:17:in `ms' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/chained/benchmarking.rb:68:in `perform_action_without_rescue' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/rescue.rb:45:in `perform_action_without_flash' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/chained/flash.rb:141:in `perform_action' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:530:in `send' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:530:in `process_without_filters' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/chained/filters.rb:601:in `process' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:374:in `action' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:382:in `action' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/routing/route_set.rb:433:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/routing/route_set.rb:433:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/head.rb:9:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/methodoverride.rb:24:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/middleware/params_parser.rb:17:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/middleware/session/abstract_store.rb:144:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/activerecord/lib/active_record/query_cache.rb:29:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/activerecord/lib/active_record/connection_adapters/abstract/query_cache.rb:34:in `cache' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/activerecord/lib/active_record/query_cache.rb:9:in `cache' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/activerecord/lib/active_record/query_cache.rb:28:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/activerecord/lib/active_record/connection_adapters/abstract/connection_pool.rb:363:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/middleware/rescue.rb:8:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/middleware/callbacks.rb:35:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/middleware/show_exceptions.rb:41:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/lock.rb:11:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/lock.rb:11:in `synchronize' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/lock.rb:11:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/railties/lib/rails/rack/static.rb:31:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/urlmap.rb:46:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/urlmap.rb:40:in `each' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/urlmap.rb:40:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/railties/lib/rails/rack/log_tailer.rb:17:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/content_length.rb:13:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/handler/webrick.rb:46:in `service' 
      /usr/lib/ruby/1.8/webrick/httpserver.rb:104:in `service' 
      /usr/lib/ruby/1.8/webrick/httpserver.rb:65:in `run' 
      /usr/lib/ruby/1.8/webrick/server.rb:173:in `start_thread' 
      /usr/lib/ruby/1.8/webrick/server.rb:162:in `start' 
      /usr/lib/ruby/1.8/webrick/server.rb:162:in `start_thread' 
      /usr/lib/ruby/1.8/webrick/server.rb:95:in `start' 
      /usr/lib/ruby/1.8/webrick/server.rb:92:in `each' 
      /usr/lib/ruby/1.8/webrick/server.rb:92:in `start' 
      /usr/lib/ruby/1.8/webrick/server.rb:23:in `start' 
      /usr/lib/ruby/1.8/webrick/server.rb:82:in `start' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/handler/webrick.rb:13:in `run' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/railties/lib/commands/server.rb:110 
      /usr/local/lib/site_ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require' 
      /usr/local/lib/site_ruby/1.8/rubygems/custom_require.rb:31:in `require' 
      makedepot.rb:2272:in `restart_server' 
      makedepot.rb:999 
      makedepot.rb:2351:in `call' 
      makedepot.rb:2351 
      makedepot.rb:2347:in `each' 
      makedepot.rb:2347 
      /usr/lib/ruby/1.8/builder/xmlbase.rb:133:in `call' 
      /usr/lib/ruby/1.8/builder/xmlbase.rb:133:in `_nested_structures' 
      /usr/lib/ruby/1.8/builder/xmlbase.rb:57:in `method_missing' 
      makedepot.rb:2310 
      /usr/lib/ruby/1.8/builder/xmlbase.rb:133:in `call' 
      /usr/lib/ruby/1.8/builder/xmlbase.rb:133:in `_nested_structures' 
      /usr/lib/ruby/1.8/builder/xmlbase.rb:57:in `method_missing' 
      makedepot.rb:2283</code></pre> 
          </div> 
         
      </div> 
       
       
       
       
       
       
       
      <h2 style="margin-top: 30px">Request</h2> 
      <p><b>Parameters</b>: <pre>None</pre></p> 
       
      <p><a href="#" onclick="document.getElementById('session_dump').style.display='block'; return false;">Show session dump</a></p> 
      <div id="session_dump" style="display:none"><pre class='debug_dump'>---  
      </pre></div> 
       
       
      <h2 style="margin-top: 30px">Response</h2> 
      <p><b>Headers</b>: <pre>None</pre></p> 
       
       
       
      </body> 
      </html> 
     
    get /users 
    
      <html xmlns="http://www.w3.org/1999/xhtml"> 
      <head> 
        <title>Action Controller: Exception caught</title> 
        <style> 
          body { background-color: #fff; color: #333; } 
       
          body, p, ol, ul, td { 
            font-family: verdana, arial, helvetica, sans-serif; 
            font-size:   13px; 
            line-height: 18px; 
          } 
       
          pre { 
            background-color: #eee; 
            padding: 10px; 
            font-size: 11px; 
          } 
       
          a { color: #000; } 
          a:visited { color: #666; } 
          a:hover { color: #fff; background-color:#000; } 
        </style> 
      </head> 
      <body> 
       
      <h1> 
        NoMethodError in 
        Users#index 
      </h1> 
       
      <p> 
        Showing <i>/home/rubys/git/awdwr/work/depot/app/views/layouts/store.html.erb</i> where line <b>#24</b> raised: 
        <pre><code>You have a nil object when you didn't expect it! 
      The error occurred while evaluating nil.items</code></pre> 
      </p> 
       
      <p>Extracted source (around line <b>#24</b>): 
      <pre><code>21:     <div id="side"> 
      22:       <!-- START_HIGHLIGHT --> 
      23:       <!-- START:hidden_div --> 
      24:       <% hidden_div_if(@cart.items.empty?, :id => "cart") do %> 
      25:         <%= render(:partial => "cart", :object => @cart) %> 
      26:       <% end %> 
      27:     <!-- END:hidden_div --> 
      </code></pre></p> 
       
      <p></p> 
       
       
       
       
      <p><code>RAILS_ROOT: /home/rubys/git/awdwr/work/depot</code></p> 
       
      <div id="traces"> 
         
           
          <a href="#" onclick="document.getElementById('Framework-Trace').style.display='none';document.getElementById('Full-Trace').style.display='none';document.getElementById('Application-Trace').style.display='block';; return false;">Application Trace</a> | 
         
           
          <a href="#" onclick="document.getElementById('Application-Trace').style.display='none';document.getElementById('Full-Trace').style.display='none';document.getElementById('Framework-Trace').style.display='block';; return false;">Framework Trace</a> | 
         
           
          <a href="#" onclick="document.getElementById('Application-Trace').style.display='none';document.getElementById('Framework-Trace').style.display='none';document.getElementById('Full-Trace').style.display='block';; return false;">Full Trace</a>  
         
       
         
          <div id="Application-Trace" style="display: block;"> 
            <pre><code>/home/rubys/git/awdwr/work/depot/app/views/layouts/store.html.erb:24:in `_render_template_200425620__615462828_0' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_view/template/template.rb:21:in `send' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_view/template/template.rb:21:in `render' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_view/render/rendering.rb:69:in `_render_template' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_view/base.rb:261:in `with_template' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_view/render/rendering.rb:65:in `_render_template' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_view/render/rendering.rb:58:in `_render_content_with_layout' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_view/render/rendering.rb:117:in `_render_template_with_layout' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/render.rb:391:in `render_for_parts' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/render.rb:400:in `render_for_action' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/render.rb:242:in `render_without_benchmark' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/chained/benchmarking.rb:51:in `render' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/activesupport/lib/active_support/core_ext/benchmark.rb:17:in `ms' 
      /usr/lib/ruby/1.8/benchmark.rb:308:in `realtime' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/activesupport/lib/active_support/core_ext/benchmark.rb:17:in `ms' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/chained/benchmarking.rb:51:in `render' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/mime_responds.rb:132:in `send' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/mime_responds.rb:132:in `custom' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/mime_responds.rb:176:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/mime_responds.rb:176:in `respond' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/mime_responds.rb:170:in `each' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/mime_responds.rb:170:in `respond' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/mime_responds.rb:107:in `respond_to' 
      /home/rubys/git/awdwr/work/depot/app/controllers/users_controller.rb:9:in `index' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:869:in `send' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:869:in `perform_action_without_filters' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/chained/filters.rb:612:in `call_filters' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/chained/filters.rb:605:in `perform_action_without_benchmark' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/chained/benchmarking.rb:68:in `perform_action_without_rescue' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/activesupport/lib/active_support/core_ext/benchmark.rb:17:in `ms' 
      /usr/lib/ruby/1.8/benchmark.rb:308:in `realtime' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/activesupport/lib/active_support/core_ext/benchmark.rb:17:in `ms' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/chained/benchmarking.rb:68:in `perform_action_without_rescue' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/rescue.rb:45:in `perform_action_without_flash' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/chained/flash.rb:141:in `perform_action' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:530:in `send' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:530:in `process_without_filters' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/chained/filters.rb:601:in `process' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:374:in `action' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:382:in `action' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/routing/route_set.rb:433:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/routing/route_set.rb:433:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/head.rb:9:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/methodoverride.rb:24:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/middleware/params_parser.rb:17:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/middleware/session/abstract_store.rb:144:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/activerecord/lib/active_record/query_cache.rb:29:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/activerecord/lib/active_record/connection_adapters/abstract/query_cache.rb:34:in `cache' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/activerecord/lib/active_record/query_cache.rb:9:in `cache' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/activerecord/lib/active_record/query_cache.rb:28:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/activerecord/lib/active_record/connection_adapters/abstract/connection_pool.rb:363:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/middleware/rescue.rb:8:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/middleware/callbacks.rb:35:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/middleware/show_exceptions.rb:41:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/lock.rb:11:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/lock.rb:11:in `synchronize' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/lock.rb:11:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/railties/lib/rails/rack/static.rb:31:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/urlmap.rb:46:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/urlmap.rb:40:in `each' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/urlmap.rb:40:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/railties/lib/rails/rack/log_tailer.rb:17:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/content_length.rb:13:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/handler/webrick.rb:46:in `service' 
      /usr/lib/ruby/1.8/webrick/httpserver.rb:104:in `service' 
      /usr/lib/ruby/1.8/webrick/httpserver.rb:65:in `run' 
      /usr/lib/ruby/1.8/webrick/server.rb:173:in `start_thread' 
      /usr/lib/ruby/1.8/webrick/server.rb:162:in `start' 
      /usr/lib/ruby/1.8/webrick/server.rb:162:in `start_thread' 
      /usr/lib/ruby/1.8/webrick/server.rb:95:in `start' 
      /usr/lib/ruby/1.8/webrick/server.rb:92:in `each' 
      /usr/lib/ruby/1.8/webrick/server.rb:92:in `start' 
      /usr/lib/ruby/1.8/webrick/server.rb:23:in `start' 
      /usr/lib/ruby/1.8/webrick/server.rb:82:in `start' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/handler/webrick.rb:13:in `run' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/railties/lib/commands/server.rb:110 
      /usr/local/lib/site_ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require' 
      /usr/local/lib/site_ruby/1.8/rubygems/custom_require.rb:31:in `require' 
      makedepot.rb:2272:in `restart_server' 
      makedepot.rb:999 
      makedepot.rb:2351:in `call' 
      makedepot.rb:2351 
      makedepot.rb:2347:in `each' 
      makedepot.rb:2347 
      makedepot.rb:2310 
      makedepot.rb:2283</code></pre> 
          </div> 
         
          <div id="Framework-Trace" style="display: none;"> 
            <pre><code>/home/rubys/git/awdwr/work/depot/app/views/layouts/store.html.erb:24:in `_render_template_200425620__615462828_0' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_view/template/template.rb:21:in `send' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_view/template/template.rb:21:in `render' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_view/render/rendering.rb:69:in `_render_template' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_view/base.rb:261:in `with_template' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_view/render/rendering.rb:65:in `_render_template' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_view/render/rendering.rb:58:in `_render_content_with_layout' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_view/render/rendering.rb:117:in `_render_template_with_layout' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/render.rb:391:in `render_for_parts' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/render.rb:400:in `render_for_action' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/render.rb:242:in `render_without_benchmark' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/chained/benchmarking.rb:51:in `render' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/activesupport/lib/active_support/core_ext/benchmark.rb:17:in `ms' 
      /usr/lib/ruby/1.8/benchmark.rb:308:in `realtime' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/activesupport/lib/active_support/core_ext/benchmark.rb:17:in `ms' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/chained/benchmarking.rb:51:in `render' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/mime_responds.rb:132:in `send' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/mime_responds.rb:132:in `custom' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/mime_responds.rb:176:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/mime_responds.rb:176:in `respond' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/mime_responds.rb:170:in `each' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/mime_responds.rb:170:in `respond' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/mime_responds.rb:107:in `respond_to' 
      /home/rubys/git/awdwr/work/depot/app/controllers/users_controller.rb:9:in `index' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:869:in `send' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:869:in `perform_action_without_filters' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/chained/filters.rb:612:in `call_filters' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/chained/filters.rb:605:in `perform_action_without_benchmark' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/chained/benchmarking.rb:68:in `perform_action_without_rescue' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/activesupport/lib/active_support/core_ext/benchmark.rb:17:in `ms' 
      /usr/lib/ruby/1.8/benchmark.rb:308:in `realtime' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/activesupport/lib/active_support/core_ext/benchmark.rb:17:in `ms' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/chained/benchmarking.rb:68:in `perform_action_without_rescue' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/rescue.rb:45:in `perform_action_without_flash' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/chained/flash.rb:141:in `perform_action' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:530:in `send' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:530:in `process_without_filters' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/chained/filters.rb:601:in `process' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:374:in `action' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:382:in `action' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/routing/route_set.rb:433:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/routing/route_set.rb:433:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/head.rb:9:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/methodoverride.rb:24:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/middleware/params_parser.rb:17:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/middleware/session/abstract_store.rb:144:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/activerecord/lib/active_record/query_cache.rb:29:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/activerecord/lib/active_record/connection_adapters/abstract/query_cache.rb:34:in `cache' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/activerecord/lib/active_record/query_cache.rb:9:in `cache' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/activerecord/lib/active_record/query_cache.rb:28:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/activerecord/lib/active_record/connection_adapters/abstract/connection_pool.rb:363:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/middleware/rescue.rb:8:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/middleware/callbacks.rb:35:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/middleware/show_exceptions.rb:41:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/lock.rb:11:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/lock.rb:11:in `synchronize' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/lock.rb:11:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/railties/lib/rails/rack/static.rb:31:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/urlmap.rb:46:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/urlmap.rb:40:in `each' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/urlmap.rb:40:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/railties/lib/rails/rack/log_tailer.rb:17:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/content_length.rb:13:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/handler/webrick.rb:46:in `service' 
      /usr/lib/ruby/1.8/webrick/httpserver.rb:104:in `service' 
      /usr/lib/ruby/1.8/webrick/httpserver.rb:65:in `run' 
      /usr/lib/ruby/1.8/webrick/server.rb:173:in `start_thread' 
      /usr/lib/ruby/1.8/webrick/server.rb:162:in `start' 
      /usr/lib/ruby/1.8/webrick/server.rb:162:in `start_thread' 
      /usr/lib/ruby/1.8/webrick/server.rb:95:in `start' 
      /usr/lib/ruby/1.8/webrick/server.rb:92:in `each' 
      /usr/lib/ruby/1.8/webrick/server.rb:92:in `start' 
      /usr/lib/ruby/1.8/webrick/server.rb:23:in `start' 
      /usr/lib/ruby/1.8/webrick/server.rb:82:in `start' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/handler/webrick.rb:13:in `run' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/railties/lib/commands/server.rb:110 
      /usr/local/lib/site_ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require' 
      /usr/local/lib/site_ruby/1.8/rubygems/custom_require.rb:31:in `require' 
      /usr/lib/ruby/1.8/builder/xmlbase.rb:133:in `call' 
      /usr/lib/ruby/1.8/builder/xmlbase.rb:133:in `_nested_structures' 
      /usr/lib/ruby/1.8/builder/xmlbase.rb:57:in `method_missing' 
      /usr/lib/ruby/1.8/builder/xmlbase.rb:133:in `call' 
      /usr/lib/ruby/1.8/builder/xmlbase.rb:133:in `_nested_structures' 
      /usr/lib/ruby/1.8/builder/xmlbase.rb:57:in `method_missing'</code></pre> 
          </div> 
         
          <div id="Full-Trace" style="display: none;"> 
            <pre><code>/home/rubys/git/awdwr/work/depot/app/views/layouts/store.html.erb:24:in `_render_template_200425620__615462828_0' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_view/template/template.rb:21:in `send' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_view/template/template.rb:21:in `render' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_view/render/rendering.rb:69:in `_render_template' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_view/base.rb:261:in `with_template' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_view/render/rendering.rb:65:in `_render_template' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_view/render/rendering.rb:58:in `_render_content_with_layout' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_view/render/rendering.rb:117:in `_render_template_with_layout' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/render.rb:391:in `render_for_parts' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/render.rb:400:in `render_for_action' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/render.rb:242:in `render_without_benchmark' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/chained/benchmarking.rb:51:in `render' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/activesupport/lib/active_support/core_ext/benchmark.rb:17:in `ms' 
      /usr/lib/ruby/1.8/benchmark.rb:308:in `realtime' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/activesupport/lib/active_support/core_ext/benchmark.rb:17:in `ms' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/chained/benchmarking.rb:51:in `render' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/mime_responds.rb:132:in `send' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/mime_responds.rb:132:in `custom' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/mime_responds.rb:176:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/mime_responds.rb:176:in `respond' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/mime_responds.rb:170:in `each' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/mime_responds.rb:170:in `respond' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/mime_responds.rb:107:in `respond_to' 
      /home/rubys/git/awdwr/work/depot/app/controllers/users_controller.rb:9:in `index' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:869:in `send' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:869:in `perform_action_without_filters' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/chained/filters.rb:612:in `call_filters' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/chained/filters.rb:605:in `perform_action_without_benchmark' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/chained/benchmarking.rb:68:in `perform_action_without_rescue' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/activesupport/lib/active_support/core_ext/benchmark.rb:17:in `ms' 
      /usr/lib/ruby/1.8/benchmark.rb:308:in `realtime' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/activesupport/lib/active_support/core_ext/benchmark.rb:17:in `ms' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/chained/benchmarking.rb:68:in `perform_action_without_rescue' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/rescue.rb:45:in `perform_action_without_flash' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/chained/flash.rb:141:in `perform_action' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:530:in `send' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:530:in `process_without_filters' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/chained/filters.rb:601:in `process' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:374:in `action' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:382:in `action' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/routing/route_set.rb:433:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/routing/route_set.rb:433:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/head.rb:9:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/methodoverride.rb:24:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/middleware/params_parser.rb:17:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/middleware/session/abstract_store.rb:144:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/activerecord/lib/active_record/query_cache.rb:29:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/activerecord/lib/active_record/connection_adapters/abstract/query_cache.rb:34:in `cache' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/activerecord/lib/active_record/query_cache.rb:9:in `cache' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/activerecord/lib/active_record/query_cache.rb:28:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/activerecord/lib/active_record/connection_adapters/abstract/connection_pool.rb:363:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/middleware/rescue.rb:8:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/middleware/callbacks.rb:35:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/middleware/show_exceptions.rb:41:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/lock.rb:11:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/lock.rb:11:in `synchronize' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/lock.rb:11:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/railties/lib/rails/rack/static.rb:31:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/urlmap.rb:46:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/urlmap.rb:40:in `each' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/urlmap.rb:40:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/railties/lib/rails/rack/log_tailer.rb:17:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/content_length.rb:13:in `call' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/handler/webrick.rb:46:in `service' 
      /usr/lib/ruby/1.8/webrick/httpserver.rb:104:in `service' 
      /usr/lib/ruby/1.8/webrick/httpserver.rb:65:in `run' 
      /usr/lib/ruby/1.8/webrick/server.rb:173:in `start_thread' 
      /usr/lib/ruby/1.8/webrick/server.rb:162:in `start' 
      /usr/lib/ruby/1.8/webrick/server.rb:162:in `start_thread' 
      /usr/lib/ruby/1.8/webrick/server.rb:95:in `start' 
      /usr/lib/ruby/1.8/webrick/server.rb:92:in `each' 
      /usr/lib/ruby/1.8/webrick/server.rb:92:in `start' 
      /usr/lib/ruby/1.8/webrick/server.rb:23:in `start' 
      /usr/lib/ruby/1.8/webrick/server.rb:82:in `start' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/handler/webrick.rb:13:in `run' 
      /home/rubys/git/awdwr/work/depot/vendor/rails/railties/lib/commands/server.rb:110 
      /usr/local/lib/site_ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require' 
      /usr/local/lib/site_ruby/1.8/rubygems/custom_require.rb:31:in `require' 
      makedepot.rb:2272:in `restart_server' 
      makedepot.rb:999 
      makedepot.rb:2351:in `call' 
      makedepot.rb:2351 
      makedepot.rb:2347:in `each' 
      makedepot.rb:2347 
      /usr/lib/ruby/1.8/builder/xmlbase.rb:133:in `call' 
      /usr/lib/ruby/1.8/builder/xmlbase.rb:133:in `_nested_structures' 
      /usr/lib/ruby/1.8/builder/xmlbase.rb:57:in `method_missing' 
      makedepot.rb:2310 
      /usr/lib/ruby/1.8/builder/xmlbase.rb:133:in `call' 
      /usr/lib/ruby/1.8/builder/xmlbase.rb:133:in `_nested_structures' 
      /usr/lib/ruby/1.8/builder/xmlbase.rb:57:in `method_missing' 
      makedepot.rb:2283</code></pre> 
          </div> 
         
      </div> 
       
       
       
       
       
       
       
      <h2 style="margin-top: 30px">Request</h2> 
      <p><b>Parameters</b>: <pre>None</pre></p> 
       
      <p><a href="#" onclick="document.getElementById('session_dump').style.display='block'; return false;">Show session dump</a></p> 
      <div id="session_dump" style="display:none"><pre class='debug_dump'>---  
      </pre></div> 
       
       
      <h2 style="margin-top: 30px">Response</h2> 
      <p><b>Headers</b>: <pre>None</pre></p> 
       
       
       
      </body> 
      </html> 
     
    edit app/views/layouts/store.html.erb 
          <% if @cart %> 
            <% hidden_div_if(@cart.items.empty?, :id => "cart") do %> 
              <%= render(:partial => "cart", :object => @cart) %> 
            <% end %> 
          <% end %> 
    get /admin 
    
 
  
    
    Pragmatic Bookshelf
  
 
  
    
    
      
            
      
Welcome 
It's Mon May 18 08:34:01 -0400 2009
We have 1 order.
    
   
     
    
    get /users 
    
 
  
    
    Pragmatic Bookshelf
  
 
  
     
    
    rm app/views/layouts/products.html.erb 
    rm app/views/layouts/users.html.erb 
    rm app/views/layouts/orders.html.erb 
    get /users 
    
 
  
    
    Pragmatic Bookshelf
  
 
  
     
    
    edit app/models/user.rb 
    require 'digest/sha1' 
      
    class User < ActiveRecord::Base 
       
      validates_presence_of     :name 
      validates_uniqueness_of   :name 
      
      attr_accessor :password_confirmation 
      validates_confirmation_of :password 
      
      validate :password_non_blank 
       
      def self.authenticate(name, password) 
        user = self.find_by_name(name) 
        if user 
          expected_password = encrypted_password(password, user.salt) 
          if user.hashed_password != expected_password 
            user = nil 
          end 
        end 
        user 
      end 
       
      # 'password' is a virtual attribute 
      def password 
        @password 
      end 
       
      def password=(pwd) 
        @password = pwd 
        return if pwd.blank? 
        create_new_salt 
        self.hashed_password = User.encrypted_password(self.password, self.salt) 
      end 
       
      def after_destroy 
        if User.count.zero? 
          raise "Can't delete last user" 
        end 
      end      
      
    private 
      
      def password_non_blank 
        errors.add(:password, "Missing password") if hashed_password.blank? 
      end 
       
      def create_new_salt 
        self.salt = self.object_id.to_s + rand.to_s 
      end 
       
      def self.encrypted_password(password, salt) 
        string_to_hash = password + "wibble" + salt 
        Digest::SHA1.hexdigest(string_to_hash) 
      end 
    end 
    edit app/controllers/users_controller.rb 
    class UsersController < ApplicationController 
      # GET /users 
      # GET /users.xml 
      def index 
        @users = User.all(:order => :name) 
      
        respond_to do |format| 
          format.html # index.html.erb 
          format.xml  { render :xml => @users } 
        end 
      end 
      
      # GET /users/1 
      # GET /users/1.xml 
      def show 
        @user = User.find(params[:id]) 
      
        respond_to do |format| 
          format.html # show.html.erb 
          format.xml  { render :xml => @user } 
        end 
      end 
      
      # GET /users/new 
      # GET /users/new.xml 
      def new 
        @user = User.new 
      
        respond_to do |format| 
          format.html # new.html.erb 
          format.xml  { render :xml => @user } 
        end 
      end 
      
      # GET /users/1/edit 
      def edit 
        @user = User.find(params[:id]) 
      end 
      
      # POST /users 
      # POST /users.xml 
      def create 
        @user = User.new(params[:user]) 
      
        respond_to do |format| 
          if @user.save 
            flash[:notice] = "User #{@user.name} was successfully created." 
            format.html { redirect_to(:action=>'index') } 
            format.xml  { render :xml => @user, :status => :created, 
                                 :location => @user } 
          else 
            format.html { render :action => "new" } 
            format.xml  { render :xml => @user.errors, 
                                 :status => :unprocessable_entity } 
          end 
        end 
      end 
      
      # PUT /users/1 
      # PUT /users/1.xml 
      def update 
        @user = User.find(params[:id]) 
      
        respond_to do |format| 
          if @user.update_attributes(params[:user]) 
            flash[:notice] = "User #{@user.name} was successfully updated." 
            format.html { redirect_to(:action=>'index') } 
            format.xml  { head :ok } 
          else 
            format.html { render :action => "edit" } 
            format.xml  { render :xml => @user.errors, 
                                 :status => :unprocessable_entity } 
          end 
        end 
      end 
      
      # DELETE /users/1 
      # DELETE /users/1.xml 
      def destroy 
        @user = User.find(params[:id]) 
        begin 
          @user.destroy 
          flash[:notice] = "User #{@user.name} deleted" 
        rescue Exception => e 
          flash[:notice] = e.message 
        end 
      
        respond_to do |format| 
          format.html { redirect_to(users_url) } 
          format.xml  { head :ok } 
        end 
      end 
    end 
    edit app/controllers/store_controller.rb 
          def find_cart 
            @cart = (session[:cart] ||= Cart.new) 
          end 
    edit app/controllers/store_controller.rb 
          before_filter :find_cart, :except => :empty_cart 
    echo "Product.new" | ruby script/console 
    >> Product.new 
    => #<Product id: nil, title: nil, description: nil, image_url: nil, created_at: nil, updated_at: nil, price: #<BigDecimal:b75aeaf8,'0.0',4(8)>> 
    >>  
    
      12.1 Generating the XML Feed 
     
    edit app/models/product.rb 
    class Product < ActiveRecord::Base 
      has_many :orders, :through => :line_items 
      has_many :line_items 
      # ... 
    ruby script/generate controller info who_bought 
          exists  app/controllers/ 
          exists  app/helpers/ 
          create  app/views/info 
          exists  test/functional/ 
          exists  test/unit/helpers/ 
          create  app/controllers/info_controller.rb 
          create  test/functional/info_controller_test.rb 
          create  app/helpers/info_helper.rb 
          create  test/unit/helpers/info_helper_test.rb 
          create  app/views/info/who_bought.html.erb 
    edit app/controllers/info_controller.rb 
    class InfoController < ApplicationController 
      def who_bought 
        @product = Product.find(params[:id]) 
        @orders  = @product.orders 
        respond_to do |format| 
          format.xml { render :layout => false } 
        end 
      end 
      
    protected 
      
      def authorize 
      end 
    end 
    edit app/views/info/who_bought.xml.builder 
    xml.order_list(:for_product => @product.title) do 
      for o in @orders 
        xml.order do 
          xml.name(o.name) 
          xml.email(o.email) 
        end 
      end 
    end 
    curl --silent http://localhost:3000/info/who_bought/3 
    <html xmlns="http://www.w3.org/1999/xhtml"> 
    <head> 
      <title>Action Controller: Exception caught</title> 
      <style> 
        body { background-color: #fff; color: #333; } 
      
        body, p, ol, ul, td { 
          font-family: verdana, arial, helvetica, sans-serif; 
          font-size:   13px; 
          line-height: 18px; 
        } 
      
        pre { 
          background-color: #eee; 
          padding: 10px; 
          font-size: 11px; 
        } 
      
        a { color: #000; } 
        a:visited { color: #666; } 
        a:hover { color: #fff; background-color:#000; } 
      </style> 
    </head> 
    <body> 
      
    <h1>Routing Error</h1> 
    <p><pre>No route matches "/info/who_bought/3" with {:method=>:get}</pre></p> 
      
      
      
    </body> 
    </html> 
    restart 
    curl --silent http://localhost:3000/info/who_bought/3 
    <h1>Info#who_bought</h1> 
    <p>Find me in app/views/info/who_bought.html.erb</p> 
    sqlite3> select * from products 
             id = 2 
          title = Pragmatic Project Automation 
    description = <p> 
           <em>Pragmatic Project Automation</em> shows you how to improve the  
           consistency and repeatability of your project's procedures using  
           automation to reduce risk and errors. 
          </p> 
          <p> 
            Simply put, we're going to put this thing called a computer to work  
            for you doing the mundane (but important) project stuff. That means  
            you'll have more time and energy to do the really  
            exciting---and difficult---stuff, like writing quality code. 
          </p> 
      image_url = /images/auto.jpg 
     created_at = 2009-05-18 12:32:47.685914 
     updated_at = 2009-05-18 12:32:47.685914 
          price = 29.95 
      
             id = 3 
          title = Pragmatic Version Control 
    description = <p> 
             This book is a recipe-based approach to using Subversion that will  
             get you up and running quickly---and correctly. All projects need 
             version control: it's a foundational piece of any project's  
             infrastructure. Yet half of all project teams in the U.S. don't use 
             any version control at all. Many others don't use it well, and end  
             up experiencing time-consuming problems. 
          </p> 
      image_url = /images/svn.jpg 
     created_at = 2009-05-18 12:32:47.688547 
     updated_at = 2009-05-18 12:32:47.688547 
          price = 28.5 
      
             id = 4 
          title = Pragmatic Unit Testing (C#) 
    description = <p> 
            Pragmatic programmers use feedback to drive their development and  
            personal processes. The most valuable feedback you can get while  
            coding comes from unit testing. 
          </p> 
          <p> 
            Without good tests in place, coding can become a frustrating game of  
            "whack-a-mole." That's the carnival game where the player strikes at a  
            mechanical mole; it retreats and another mole pops up on the opposite side  
            of the field. The moles pop up and down so fast that you end up flailing  
            your mallet helplessly as the moles continue to pop up where you least  
            expect them. 
          </p> 
      image_url = /images/utc.jpg 
     created_at = 2009-05-18 12:32:47.691302 
     updated_at = 2009-05-18 12:32:47.691302 
          price = 27.75 
    sqlite3> select * from line_items 
             id = 1 
     product_id = 3 
       order_id = 1 
       quantity = 1 
    total_price = 28.5 
     created_at = 2009-05-18 12:33:36.759832 
     updated_at = 2009-05-18 12:33:36.759832 
    curl --silent http://localhost:3000/info/who_bought/3 
    <h1>Info#who_bought</h1> 
    <p>Find me in app/views/info/who_bought.html.erb</p> 
    edit app/views/info/who_bought.html.erb 
    <h3>People Who Bought <%= @product.title %></h3> 
     
    <ul> 
      <% for order in @orders  -%> 
        <li> 
            <%= mail_to order.email, order.name %> 
        </li> 
      <%  end -%> 
    </ul> 
    edit app/controllers/info_controller.rb 
    class InfoController < ApplicationController 
      def who_bought 
        @product = Product.find(params[:id]) 
        @orders  = @product.orders 
        respond_to do |format| 
          format.html 
          format.xml { render :layout => false } 
        end 
      end 
      
    protected 
      
      def authorize 
      end 
    end 
    curl --silent -H "Accept: text/html" http://localhost:3000/info/who_bought/3 
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
                          "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
    <!-- START:jit --> 
    <html> 
    <head> 
      <title>Pragprog Books Online Store</title> 
    <!-- START:stylesheet --> 
      <link href="/stylesheets/depot.css?1242650014" media="all" rel="stylesheet" type="text/css" /> 
    <!-- END:stylesheet --> 
      <script src="/javascripts/prototype.js?1242649943" type="text/javascript"></script> 
    <script src="/javascripts/effects.js?1242649943" type="text/javascript"></script> 
    <script src="/javascripts/dragdrop.js?1242649943" type="text/javascript"></script> 
    <script src="/javascripts/controls.js?1242649943" type="text/javascript"></script> 
    <script src="/javascripts/application.js?1242649943" type="text/javascript"></script> 
    </head> 
    <!-- END:jit --> 
    <body id="store"> 
      <div id="banner"> 
        <img alt="Logo" src="/images/logo.png?1242649967" /> 
        Pragmatic Bookshelf 
      </div> 
      <div id="columns"> 
        <div id="side"> 
          <!-- START:hidden_div --> 
    <!-- START_HIGHLIGHT --> 
      
    <!-- END_HIGHLIGHT --> 
        <!-- END:hidden_div --> 
      
          <a href="http://www....">Home</a><br /> 
          <a href="http://www..../faq">Questions</a><br /> 
          <a href="http://www..../news">News</a><br /> 
          <a href="http://www..../contact">Contact</a><br /> 
      
          <!-- START_HIGHLIGHT --> 
      
          <!-- END_HIGHLIGHT --> 
        </div> 
        <div id="main"> 
          <!-- START:flash --> 
                <!-- END:flash --> 
      
          <h3>People Who Bought Pragmatic Version Control</h3> 
      
    <ul> 
          <li> 
            <a href="mailto:customer@pragprog.com">Dave Thomas</a> 
        </li> 
      </ul> 
      
        </div> 
      </div> 
    </body> 
    </html> 
    curl --silent -H "Accept: application/xml" http://localhost:3000/info/who_bought/3 
    <order_list for_product="Pragmatic Version Control"> 
      <order> 
        <name>Dave Thomas</name> 
        <email>customer@pragprog.com</email> 
      </order> 
    </order_list> 
    cp app/controllers/info_controller.rb app/controllers/info_controller.save 
    edit app/controllers/info_controller.rb 
    class InfoController < ApplicationController 
      def who_bought 
        @product = Product.find(params[:id]) 
        @orders  = @product.orders 
        respond_to do |format| 
          format.html 
          format.xml { render :layout => false , 
                       :xml => @product.to_xml(:include => :orders) } 
        end 
      end 
      
    protected 
      
      def authorize 
      end 
    end 
    curl --silent http://localhost:3000/info/who_bought/3.xml 
    <?xml version="1.0" encoding="UTF-8"?> 
    <product> 
      <created-at type="datetime">2009-05-18T12:32:47Z</created-at> 
      <description><p> 
             This book is a recipe-based approach to using Subversion that will  
             get you up and running quickly---and correctly. All projects need 
             version control: it's a foundational piece of any project's  
             infrastructure. Yet half of all project teams in the U.S. don't use 
             any version control at all. Many others don't use it well, and end  
             up experiencing time-consuming problems. 
          </p></description> 
      <id type="integer">3</id> 
      <image-url>/images/svn.jpg</image-url> 
      <price type="decimal">28.5</price> 
      <title>Pragmatic Version Control</title> 
      <updated-at type="datetime">2009-05-18T12:32:47Z</updated-at> 
      <orders type="array"> 
        <order> 
          <address>123 Main St</address> 
          <created-at type="datetime">2009-05-18T12:33:36Z</created-at> 
          <email>customer@pragprog.com</email> 
          <id type="integer">1</id> 
          <name>Dave Thomas</name> 
          <pay-type>check</pay-type> 
          <updated-at type="datetime">2009-05-18T12:33:36Z</updated-at> 
        </order> 
      </orders> 
    </product> 
    edit app/views/info/who_bought.atom.builder 
    atom_feed do |feed| 
      feed.title "Who bought #{@product.title}" 
      feed.updated @orders.first.created_at 
     
      for order in @orders 
        feed.entry(order) do |entry| 
          entry.title "Order #{order.id}" 
          entry.summary :type => 'xhtml' do |xhtml| 
            xhtml.p "Shipped to #{order.address}" 
     
            xhtml.table do 
              xhtml.tr do 
                xhtml.th 'Product' 
                xhtml.th 'Quantity' 
                xhtml.th 'Total Price' 
              end 
              for item in order.line_items 
                xhtml.tr do 
                  xhtml.td item.product.title 
                  xhtml.td item.quantity 
                  xhtml.td number_to_currency item.total_price 
                end 
              end 
              xhtml.tr do 
                xhtml.th 'total', :colspan => 2 
                xhtml.th number_to_currency \ 
                  order.line_items.map(&:total_price).sum 
              end 
            end 
     
            xhtml.p "Paid by #{order.pay_type}" 
          end 
          entry.author do |author| 
            entry.name order.name 
            entry.email order.email 
          end 
        end 
      end 
    end 
    edit app/controllers/info_controller.rb 
    class InfoController < ApplicationController 
      def who_bought 
        @product = Product.find(params[:id]) 
        @orders  = @product.orders 
        respond_to do |format| 
          format.html 
          format.atom { render :layout => false } 
          format.xml { render :layout => false , 
                       :xml => @product.to_xml(:include => :orders) } 
        end 
      end 
      
    protected 
      
      def authorize 
      end 
    end 
    curl --silent http://localhost:3000/info/who_bought/3.atom 
    <?xml version="1.0" encoding="UTF-8"?> 
    <feed xml:lang="en-US" xmlns="http://www.w3.org/2005/Atom"> 
      <id>tag:localhost,2005:/info/who_bought/3</id> 
      <link type="text/html" href="http://localhost:3000" rel="alternate"/> 
      <link type="application/atom+xml" href="http://localhost:3000/info/who_bought/3.atom" rel="self"/> 
      <title>Who bought Pragmatic Version Control</title> 
      <updated>2009-05-18T12:33:36Z</updated> 
      <entry> 
        <id>tag:localhost,2005:Order/1</id> 
        <published>2009-05-18T12:33:36Z</published> 
        <updated>2009-05-18T12:33:36Z</updated> 
        <link type="text/html" href="http://localhost:3000/orders/1" rel="alternate"/> 
        <title>Order 1</title> 
        <summary type="xhtml"> 
          <div xmlns="http://www.w3.org/1999/xhtml"> 
            <p>Shipped to 123 Main St</p> 
            <table> 
              <tr> 
                <th>Product</th> 
                <th>Quantity</th> 
                <th>Total Price</th> 
              </tr> 
              <tr> 
                <td>Pragmatic Version Control</td> 
                <td>1</td> 
                <td>$28.50</td> 
              </tr> 
              <tr> 
                <th colspan="2">total</th> 
                <th>$28.50</th> 
              </tr> 
            </table> 
            <p>Paid by check</p> 
          </div> 
        </summary> 
        <author> 
          <name>Dave Thomas</name> 
          <email>customer@pragprog.com</email> 
        </author> 
      </entry> 
    </feed> 
    edit app/controllers/info_controller.rb 
    class InfoController < ApplicationController 
      def who_bought 
        @product = Product.find(params[:id]) 
        @orders  = @product.orders 
        respond_to do |format| 
          format.html 
          format.atom { render :layout => false } 
          format.xml { render :layout => false , 
                       :xml => @product.to_xml(:include => :orders) } 
          format.json { render :layout => false , 
                       :json => @product.to_json(:include => :orders) } 
        end 
      end 
      
    protected 
      
      def authorize 
      end 
    end 
    curl --silent -H "Accept: application/json" http://localhost:3000/info/who_bought/3 
    {"product":{"price":28.5,"orders":[{"name":"Dave Thomas","address":"123 Main St","created_at":"2009-05-18T12:33:36Z","updated_at":"2009-05-18T12:33:36Z","pay_type":"check","id":1,"email":"customer@pragprog.com"}],"created_at":"2009-05-18T12:32:47Z","title":"Pragmatic Version Control","image_url":"/images/svn.jpg","updated_at":"2009-05-18T12:32:47Z","id":3,"description":"<p>\n         This book is a recipe-based approach to using Subversion that will \n         get you up and running quickly---and correctly. All projects need\n         version control: it's a foundational piece of any project's \n         infrastructure. Yet half of all project teams in the U.S. don't use\n         any version control at all. Many others don't use it well, and end \n         up experiencing time-consuming problems.\n      </p>"}} 
    mv app/controllers/info_controller.save app/controllers/info_controller.rb 
    rake doc:app 
    rm -r doc/app 
     
                         README_FOR_APP:  
                           cart_item.rb: c.... 
                           line_item.rb: c. 
                               order.rb: c. 
                             product.rb: c.. 
                                user.rb: c....... 
                                cart.rb: c.... 
              application_controller.rb: c. 
                   orders_controller.rb: c....... 
                    admin_controller.rb: c... 
               line_items_controller.rb: c....... 
                    store_controller.rb: c........ 
                     info_controller.rb: c.. 
                    users_controller.rb: c....... 
                 products_controller.rb: c....... 
                         info_helper.rb: m 
                        store_helper.rb: m. 
                  application_helper.rb: m 
                   line_items_helper.rb: m 
                       orders_helper.rb: m 
                        admin_helper.rb: m 
                        users_helper.rb: m 
                     products_helper.rb: m 
    Generating HTML... 
    (in /home/rubys/git/awdwr/work/depot) 
      
    Files:   23 
    Classes: 14 
    Modules: 8 
    Methods: 62 
    Elapsed: 0.947s 
    rake stats 
    (in /home/rubys/git/awdwr/work/depot) 
    +----------------------+-------+-------+---------+---------+-----+-------+ 
    | Name                 | Lines |   LOC | Classes | Methods | M/C | LOC/M | 
    +----------------------+-------+-------+---------+---------+-----+-------+ 
    | Controllers          |   516 |   344 |       8 |      42 |   5 |     6 | 
    | Helpers              |    23 |    22 |       0 |       1 |   0 |    20 | 
    | Models               |   229 |   129 |       6 |      19 |   3 |     4 | 
    | Libraries            |     0 |     0 |       0 |       0 |   0 |     0 | 
    | Integration tests    |     0 |     0 |       0 |       0 |   0 |     0 | 
    | Functional tests     |   204 |   162 |       7 |       0 |   0 |     0 | 
    | Unit tests           |    60 |    45 |      11 |       0 |   0 |     0 | 
    +----------------------+-------+-------+---------+---------+-----+-------+ 
    | Total                |  1032 |   702 |      32 |      62 |   1 |     9 | 
    +----------------------+-------+-------+---------+---------+-----+-------+ 
      Code LOC: 495     Test LOC: 207     Code to Test Ratio: 1:0.4 
      
    
      13 Task I: Internationalization 
     
    get /store/empty_cart 
    
You are being 
redirected .    
 
    
    get http://127.0.0.1:3000/store 
    
 
  
    
    Pragmatic Bookshelf
  
 
  
    
    
      
            
      Your Pragmatic Catalog 
  
     
    Pragmatic Project Automation 
    
       Pragmatic Project Automation  shows you how to improve the 
       consistency and repeatability of your project's procedures using 
       automation to reduce risk and errors.
      
      
        Simply put, we're going to put this thing called a computer to work 
        for you doing the mundane (but important) project stuff. That means 
        you'll have more time and energy to do the really 
        exciting---and difficult---stuff, like writing quality code.
      
    
   
  
     
    Pragmatic Unit Testing (C#) 
    
        Pragmatic programmers use feedback to drive their development and 
        personal processes. The most valuable feedback you can get while 
        coding comes from unit testing.
      
      
        Without good tests in place, coding can become a frustrating game of 
        "whack-a-mole." That's the carnival game where the player strikes at a 
        mechanical mole; it retreats and another mole pops up on the opposite side 
        of the field. The moles pop up and down so fast that you end up flailing 
        your mallet helplessly as the moles continue to pop up where you least 
        expect them.
      
    
   
  
     
    Pragmatic Version Control 
    
         This book is a recipe-based approach to using Subversion that will 
         get you up and running quickly---and correctly. All projects need
         version control: it's a foundational piece of any project's 
         infrastructure. Yet half of all project teams in the U.S. don't use
         any version control at all. Many others don't use it well, and end 
         up experiencing time-consuming problems.
      
    
   
     
   
     
    
    cp /home/rubys/git/awdwr/data/i18n/initializer.rb config/initializers/i18n.rb 
    restart 
    edit app/views/layouts/store.html.erb 
      <% form_tag '', :method => 'GET', :class => 'locale' do %> 
        <%= select_tag 'locale', options_for_select(LANGUAGES, I18n.locale), 
          :onchange => 'this.form.submit()' %> 
        <%= submit_tag 'submit' %> 
        <%= javascript_tag "$$('.locale input').each(Element.hide)" %> 
      <% end %> 
    get /store?locale=en 
    
 
  
  
    
    
      
            
      Your Pragmatic Catalog 
  
     
    Pragmatic Project Automation 
    
       Pragmatic Project Automation  shows you how to improve the 
       consistency and repeatability of your project's procedures using 
       automation to reduce risk and errors.
      
      
        Simply put, we're going to put this thing called a computer to work 
        for you doing the mundane (but important) project stuff. That means 
        you'll have more time and energy to do the really 
        exciting---and difficult---stuff, like writing quality code.
      
    
   
  
     
    Pragmatic Unit Testing (C#) 
    
        Pragmatic programmers use feedback to drive their development and 
        personal processes. The most valuable feedback you can get while 
        coding comes from unit testing.
      
      
        Without good tests in place, coding can become a frustrating game of 
        "whack-a-mole." That's the carnival game where the player strikes at a 
        mechanical mole; it retreats and another mole pops up on the opposite side 
        of the field. The moles pop up and down so fast that you end up flailing 
        your mallet helplessly as the moles continue to pop up where you least 
        expect them.
      
    
   
  
     
    Pragmatic Version Control 
    
         This book is a recipe-based approach to using Subversion that will 
         get you up and running quickly---and correctly. All projects need
         version control: it's a foundational piece of any project's 
         infrastructure. Yet half of all project teams in the U.S. don't use
         any version control at all. Many others don't use it well, and end 
         up experiencing time-consuming problems.
      
    
   
     
   
     
    
    edit app/controllers/application_controller.rb 
    # Filters added to this controller apply to all controllers in the application. 
    # Likewise, all the methods added will be available for all controllers. 
      
    class ApplicationController < ActionController::Base 
      layout "store" 
      #... 
      before_filter :authorize, :except => :login 
      before_filter :set_locale 
      helper :all # include all helpers, all the time 
      protect_from_forgery # See ActionController::RequestForgeryProtection for details 
      
      # Scrub sensitive parameters from your log 
      # filter_parameter_logging :password 
         
    protected 
      def authorize 
        unless User.find_by_id(session[:user_id]) 
          flash[:notice] = "Please log in" 
          redirect_to :controller => 'admin', :action => 'login' 
        end 
      end 
      
      def set_locale 
        session[:locale] = params[:locale] if params[:locale] 
        I18n.locale = session[:locale] || I18n.default_locale 
      
        locale_path = "#{LOCALES_DIRECTORY}#{I18n.locale}.yml" 
      
        unless I18n.load_path.include? locale_path 
          I18n.load_path << locale_path 
          I18n.backend.send(:init_translations) 
        end 
      
      rescue Exception => err 
        logger.error err 
        flash.now[:notice] = "#{I18n.locale} translation not available" 
      
        I18n.load_path -= [locale_path] 
        I18n.locale = session[:locale] = I18n.default_locale 
      end 
    end 
    edit public/stylesheets/depot.css 
    .locale { 
            float:right; 
            padding-top: 0.2em 
    } 
    restart 
    get /store?locale=es 
    
 
  
  
    
    
      
              es translation not available
            
      Your Pragmatic Catalog 
  
     
    Pragmatic Project Automation 
    
       Pragmatic Project Automation  shows you how to improve the 
       consistency and repeatability of your project's procedures using 
       automation to reduce risk and errors.
      
      
        Simply put, we're going to put this thing called a computer to work 
        for you doing the mundane (but important) project stuff. That means 
        you'll have more time and energy to do the really 
        exciting---and difficult---stuff, like writing quality code.
      
    
   
  
     
    Pragmatic Unit Testing (C#) 
    
        Pragmatic programmers use feedback to drive their development and 
        personal processes. The most valuable feedback you can get while 
        coding comes from unit testing.
      
      
        Without good tests in place, coding can become a frustrating game of 
        "whack-a-mole." That's the carnival game where the player strikes at a 
        mechanical mole; it retreats and another mole pops up on the opposite side 
        of the field. The moles pop up and down so fast that you end up flailing 
        your mallet helplessly as the moles continue to pop up where you least 
        expect them.
      
    
   
  
     
    Pragmatic Version Control 
    
         This book is a recipe-based approach to using Subversion that will 
         get you up and running quickly---and correctly. All projects need
         version control: it's a foundational piece of any project's 
         infrastructure. Yet half of all project teams in the U.S. don't use
         any version control at all. Many others don't use it well, and end 
         up experiencing time-consuming problems.
      
    
   
     
   
     
    
    edit app/views/layouts/store.html.erb 
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
                          "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
    <html> 
    <head> 
      <title>Pragprog Books Online Store</title> 
      <%= stylesheet_link_tag "depot", :media => "all" %> 
      <%= javascript_include_tag :defaults %> 
    </head> 
    <body id="store"> 
      <div id="banner"> 
      <% form_tag '', :method => 'GET', :class => 'locale' do %> 
        <%= select_tag 'locale', options_for_select(LANGUAGES, I18n.locale), 
          :onchange => 'this.form.submit()' %> 
        <%= submit_tag 'submit' %> 
        <%= javascript_tag "$$('.locale input').each(Element.hide)" %> 
      <% end %> 
        <%= image_tag("logo.png") %> 
        <%= @page_title || I18n.t('layout.title') %> 
      </div> 
      <div id="columns"> 
        <div id="side"> 
          <% if @cart %> 
            <% hidden_div_if(@cart.items.empty?, :id => "cart") do %> 
              <%= render(:partial => "cart", :object => @cart) %> 
            <% end %> 
          <% end %> 
      
          <a href="http://www...."><%= I18n.t 'layout.side.home' %></a><br /> 
          <a href="http://www..../faq"><%= I18n.t 'layout.side.questions' %></a><br /> 
          <a href="http://www..../news"><%= I18n.t 'layout.side.news' %></a><br /> 
          <a href="http://www..../contact"><%= I18n.t 'layout.side.contact' %></a><br /> 
          <% if session[:user_id] %> 
            <br /> 
            <%= link_to 'Orders',   :controller => 'orders' %><br /> 
            <%= link_to 'Products', :controller => 'products' %><br /> 
            <%= link_to 'Users',    :controller => 'users'    %><br /> 
            <br /> 
            <%= link_to 'Logout', :controller => 'admin', :action => 'logout' %> 
          <% end %> 
        </div> 
        <div id="main"> 
          <% if flash[:notice] -%> 
            <div id="notice"><%= flash[:notice] %></div> 
          <% end -%> 
      
          <%= yield :layout %> 
        </div> 
      </div> 
    </body> 
    </html> 
    cp -r /home/rubys/git/awdwr/data/i18n/*.yml config/locales 
    get /store?locale=es 
    
 
  
  
    
    
      
            
      Your Pragmatic Catalog 
  
     
    Pragmatic Project Automation 
    
       Pragmatic Project Automation  shows you how to improve the 
       consistency and repeatability of your project's procedures using 
       automation to reduce risk and errors.
      
      
        Simply put, we're going to put this thing called a computer to work 
        for you doing the mundane (but important) project stuff. That means 
        you'll have more time and energy to do the really 
        exciting---and difficult---stuff, like writing quality code.
      
    
   
  
     
    Pragmatic Unit Testing (C#) 
    
        Pragmatic programmers use feedback to drive their development and 
        personal processes. The most valuable feedback you can get while 
        coding comes from unit testing.
      
      
        Without good tests in place, coding can become a frustrating game of 
        "whack-a-mole." That's the carnival game where the player strikes at a 
        mechanical mole; it retreats and another mole pops up on the opposite side 
        of the field. The moles pop up and down so fast that you end up flailing 
        your mallet helplessly as the moles continue to pop up where you least 
        expect them.
      
    
   
  
     
    Pragmatic Version Control 
    
         This book is a recipe-based approach to using Subversion that will 
         get you up and running quickly---and correctly. All projects need
         version control: it's a foundational piece of any project's 
         infrastructure. Yet half of all project teams in the U.S. don't use
         any version control at all. Many others don't use it well, and end 
         up experiencing time-consuming problems.
      
    
   
     
   
     
    
    edit app/views/store/index.html.erb 
    <h1><%= I18n.t 'main.title' %></h1> 
      
    <% for product in @products -%> 
      <div class="entry"> 
        <%= image_tag(product.image_url) %> 
        <h3><%=h product.title %></h3> 
        <%= product.description %> 
        <div class="price-line"> 
        <span class="price"><%= number_to_currency(product.price) %></span> 
        <% form_remote_tag :url => {:action => 'add_to_cart', :id => product} do %> 
          <%= submit_tag I18n.t('main.button.add') %> 
        <% end %> 
        </div> 
      </div> 
    <% end %> 
    get /store?locale=es 
    
 
  
  
    
    
      
            
      
Su Catálogo de Pragmatic 
  
     
    Pragmatic Project Automation 
    
       Pragmatic Project Automation  shows you how to improve the 
       consistency and repeatability of your project's procedures using 
       automation to reduce risk and errors.
      
      
        Simply put, we're going to put this thing called a computer to work 
        for you doing the mundane (but important) project stuff. That means 
        you'll have more time and energy to do the really 
        exciting---and difficult---stuff, like writing quality code.
      
    
   
  
     
    Pragmatic Unit Testing (C#) 
    
        Pragmatic programmers use feedback to drive their development and 
        personal processes. The most valuable feedback you can get while 
        coding comes from unit testing.
      
      
        Without good tests in place, coding can become a frustrating game of 
        "whack-a-mole." That's the carnival game where the player strikes at a 
        mechanical mole; it retreats and another mole pops up on the opposite side 
        of the field. The moles pop up and down so fast that you end up flailing 
        your mallet helplessly as the moles continue to pop up where you least 
        expect them.
      
    
   
  
     
    Pragmatic Version Control 
    
         This book is a recipe-based approach to using Subversion that will 
         get you up and running quickly---and correctly. All projects need
         version control: it's a foundational piece of any project's 
         infrastructure. Yet half of all project teams in the U.S. don't use
         any version control at all. Many others don't use it well, and end 
         up experiencing time-consuming problems.
      
    
   
     
   
     
    
    edit app/views/store/_cart.html.erb 
    <div class="cart-title"><%= I18n.t 'layout.cart.title' %></div> 
    <table> 
      <%= render(:partial => "cart_item", :collection => cart.items) %>   
       
      <tr class="total-line"> 
        <td colspan="2">Total</td> 
        <td class="total-cell"><%= number_to_currency(cart.total_price) %></td> 
      </tr> 
      
    </table> 
       
    <%= button_to I18n.t('layout.cart.button.checkout'), :action => 'checkout' %> 
    <%= button_to I18n.t('layout.cart.button.empty'), :action => :empty_cart %> 
    get /store/add_to_cart/2 
    
You are being 
redirected .    
 
    
    get http://127.0.0.1:3000/store 
    
 
  
  
    
    
      
            
      
Su Catálogo de Pragmatic 
  
     
    Pragmatic Project Automation 
    
       Pragmatic Project Automation  shows you how to improve the 
       consistency and repeatability of your project's procedures using 
       automation to reduce risk and errors.
      
      
        Simply put, we're going to put this thing called a computer to work 
        for you doing the mundane (but important) project stuff. That means 
        you'll have more time and energy to do the really 
        exciting---and difficult---stuff, like writing quality code.
      
    
   
  
     
    Pragmatic Unit Testing (C#) 
    
        Pragmatic programmers use feedback to drive their development and 
        personal processes. The most valuable feedback you can get while 
        coding comes from unit testing.
      
      
        Without good tests in place, coding can become a frustrating game of 
        "whack-a-mole." That's the carnival game where the player strikes at a 
        mechanical mole; it retreats and another mole pops up on the opposite side 
        of the field. The moles pop up and down so fast that you end up flailing 
        your mallet helplessly as the moles continue to pop up where you least 
        expect them.
      
    
   
  
     
    Pragmatic Version Control 
    
         This book is a recipe-based approach to using Subversion that will 
         get you up and running quickly---and correctly. All projects need
         version control: it's a foundational piece of any project's 
         infrastructure. Yet half of all project teams in the U.S. don't use
         any version control at all. Many others don't use it well, and end 
         up experiencing time-consuming problems.
      
    
   
     
   
     
    
    edit app/views/store/checkout.html.erb 
    <div class="depot-form"> 
       
      <%= error_messages_for 'order' %> 
       
      <% form_for :order, :url => { :action => :save_order } do |form| %> 
        <fieldset> 
          <legend><%= I18n.t 'checkout.legend' %></legend> 
      
          <div> 
            <%= form.label :name, I18n.t('checkout.name') + ":" %> 
            <%= form.text_field :name, :size => 40 %> 
          </div> 
      
          <div> 
            <%= form.label :address, I18n.t('checkout.address') + ":" %> 
            <%= form.text_area :address, :rows => 3, :cols => 40 %> 
          </div> 
      
          <div> 
            <%= form.label :email, I18n.t('checkout.email') + ":" %> 
            <%= form.text_field :email, :size => 40 %> 
          </div> 
      
          <div> 
            <%= form.label :pay_type, I18n.t('checkout.pay_type') + ":" %> 
            <%= 
              form.select :pay_type, 
                           Order::PAYMENT_TYPES,  
                          :prompt => I18n.t('checkout.pay_prompt') 
            %> 
          </div> 
         
          <%= submit_tag I18n.t('checkout.submit'), :class => "submit" %> 
        </fieldset> 
      <% end %>   
    </div> 
    edit app/controllers/store_controller.rb 
    class StoreController < ApplicationController 
          before_filter :find_cart, :except => :empty_cart 
      def index 
        @products = Product.find_products_for_sale 
      end 
      
      
      def add_to_cart 
        product = Product.find(params[:id]) 
        @current_item = @cart.add_product(product) 
        respond_to do |format| 
          format.js if request.xhr? 
          format.html {redirect_to_index} 
        end 
      rescue ActiveRecord::RecordNotFound 
        logger.error("Attempt to access invalid product #{params[:id]}") 
        redirect_to_index("Invalid product") 
      end 
      
      def checkout 
        if @cart.items.empty? 
          redirect_to_index("Your cart is empty") 
        else 
          @order = Order.new 
        end 
      end 
      
      def save_order 
        @order = Order.new(params[:order]) 
        @order.add_line_items_from_cart(@cart) 
        if @order.save 
          session[:cart] = nil 
          redirect_to_index(I18n.t('flash.thanks')) 
        else 
          render :action => 'checkout' 
        end 
      end 
      
      def empty_cart 
        session[:cart] = nil 
        redirect_to_index 
      end 
      
    private 
      
      def redirect_to_index(msg = nil) 
        flash[:notice] = msg if msg 
        redirect_to :action => 'index' 
      end 
      
          def find_cart 
            @cart = (session[:cart] ||= Cart.new) 
          end 
      
      #... 
    protected 
      
      def authorize 
      end 
    end 
    get /store?locale=es 
    
 
  
  
    
    
      
            
      
Su Catálogo de Pragmatic 
  
     
    Pragmatic Project Automation 
    
       Pragmatic Project Automation  shows you how to improve the 
       consistency and repeatability of your project's procedures using 
       automation to reduce risk and errors.
      
      
        Simply put, we're going to put this thing called a computer to work 
        for you doing the mundane (but important) project stuff. That means 
        you'll have more time and energy to do the really 
        exciting---and difficult---stuff, like writing quality code.
      
    
   
  
     
    Pragmatic Unit Testing (C#) 
    
        Pragmatic programmers use feedback to drive their development and 
        personal processes. The most valuable feedback you can get while 
        coding comes from unit testing.
      
      
        Without good tests in place, coding can become a frustrating game of 
        "whack-a-mole." That's the carnival game where the player strikes at a 
        mechanical mole; it retreats and another mole pops up on the opposite side 
        of the field. The moles pop up and down so fast that you end up flailing 
        your mallet helplessly as the moles continue to pop up where you least 
        expect them.
      
    
   
  
     
    Pragmatic Version Control 
    
         This book is a recipe-based approach to using Subversion that will 
         get you up and running quickly---and correctly. All projects need
         version control: it's a foundational piece of any project's 
         infrastructure. Yet half of all project teams in the U.S. don't use
         any version control at all. Many others don't use it well, and end 
         up experiencing time-consuming problems.
      
    
   
     
   
     
    
    get /store/add_to_cart/2 
    
You are being 
redirected .    
 
    
    get http://127.0.0.1:3000/store 
    
 
  
  
    
    
      
            
      
Su Catálogo de Pragmatic 
  
     
    Pragmatic Project Automation 
    
       Pragmatic Project Automation  shows you how to improve the 
       consistency and repeatability of your project's procedures using 
       automation to reduce risk and errors.
      
      
        Simply put, we're going to put this thing called a computer to work 
        for you doing the mundane (but important) project stuff. That means 
        you'll have more time and energy to do the really 
        exciting---and difficult---stuff, like writing quality code.
      
    
   
  
     
    Pragmatic Unit Testing (C#) 
    
        Pragmatic programmers use feedback to drive their development and 
        personal processes. The most valuable feedback you can get while 
        coding comes from unit testing.
      
      
        Without good tests in place, coding can become a frustrating game of 
        "whack-a-mole." That's the carnival game where the player strikes at a 
        mechanical mole; it retreats and another mole pops up on the opposite side 
        of the field. The moles pop up and down so fast that you end up flailing 
        your mallet helplessly as the moles continue to pop up where you least 
        expect them.
      
    
   
  
     
    Pragmatic Version Control 
    
         This book is a recipe-based approach to using Subversion that will 
         get you up and running quickly---and correctly. All projects need
         version control: it's a foundational piece of any project's 
         infrastructure. Yet half of all project teams in the U.S. don't use
         any version control at all. Many others don't use it well, and end 
         up experiencing time-consuming problems.
      
    
   
     
   
     
    
    get /store/checkout 
    
    
    get /store/save_order 
    
    
    get /store/save_order 
    
    
    post /store/save_order 
    
      order[pay_type] => check 
      order[address] => 123 Main St., Anytown USA 
      order[email] => juser@hotmail.com 
      order[name] => Joe User 
     
    
You are being 
redirected .    
 
    
    get http://127.0.0.1:3000/store 
    
 
  
  
    
    
      
              Gracias por su pedido
            
      
Su Catálogo de Pragmatic 
  
     
    Pragmatic Project Automation 
    
       Pragmatic Project Automation  shows you how to improve the 
       consistency and repeatability of your project's procedures using 
       automation to reduce risk and errors.
      
      
        Simply put, we're going to put this thing called a computer to work 
        for you doing the mundane (but important) project stuff. That means 
        you'll have more time and energy to do the really 
        exciting---and difficult---stuff, like writing quality code.
      
    
   
  
     
    Pragmatic Unit Testing (C#) 
    
        Pragmatic programmers use feedback to drive their development and 
        personal processes. The most valuable feedback you can get while 
        coding comes from unit testing.
      
      
        Without good tests in place, coding can become a frustrating game of 
        "whack-a-mole." That's the carnival game where the player strikes at a 
        mechanical mole; it retreats and another mole pops up on the opposite side 
        of the field. The moles pop up and down so fast that you end up flailing 
        your mallet helplessly as the moles continue to pop up where you least 
        expect them.
      
    
   
  
     
    Pragmatic Version Control 
    
         This book is a recipe-based approach to using Subversion that will 
         get you up and running quickly---and correctly. All projects need
         version control: it's a foundational piece of any project's 
         infrastructure. Yet half of all project teams in the U.S. don't use
         any version control at all. Many others don't use it well, and end 
         up experiencing time-consuming problems.
      
    
   
     
   
     
    
    get /store?locale=en 
    
 
  
  
    
    
      
            
      
Your Pragmatic Catalog 
  
     
    Pragmatic Project Automation 
    
       Pragmatic Project Automation  shows you how to improve the 
       consistency and repeatability of your project's procedures using 
       automation to reduce risk and errors.
      
      
        Simply put, we're going to put this thing called a computer to work 
        for you doing the mundane (but important) project stuff. That means 
        you'll have more time and energy to do the really 
        exciting---and difficult---stuff, like writing quality code.
      
    
   
  
     
    Pragmatic Unit Testing (C#) 
    
        Pragmatic programmers use feedback to drive their development and 
        personal processes. The most valuable feedback you can get while 
        coding comes from unit testing.
      
      
        Without good tests in place, coding can become a frustrating game of 
        "whack-a-mole." That's the carnival game where the player strikes at a 
        mechanical mole; it retreats and another mole pops up on the opposite side 
        of the field. The moles pop up and down so fast that you end up flailing 
        your mallet helplessly as the moles continue to pop up where you least 
        expect them.
      
    
   
  
     
    Pragmatic Version Control 
    
         This book is a recipe-based approach to using Subversion that will 
         get you up and running quickly---and correctly. All projects need
         version control: it's a foundational piece of any project's 
         infrastructure. Yet half of all project teams in the U.S. don't use
         any version control at all. Many others don't use it well, and end 
         up experiencing time-consuming problems.
      
    
   
     
   
     
    
    
      14.1 Tests Baked Right In 
     
    ls -p test 
    fixtures/ 
    functional/ 
    integration/ 
    performance/ 
    test_helper.rb 
    unit/ 
    ls test/unit 
    helpers 
    line_item_test.rb 
    order_test.rb 
    product_test.rb 
    user_test.rb 
    ls test/functional 
    admin_controller_test.rb 
    info_controller_test.rb 
    line_items_controller_test.rb 
    orders_controller_test.rb 
    products_controller_test.rb 
    store_controller_test.rb 
    users_controller_test.rb 
    
      14.2 Unit Testing of Models 
     
    cat test/unit/product_test.rb 
    require 'test_helper' 
      
    class ProductTest < ActiveSupport::TestCase 
      # Replace this with your real tests. 
      test "the truth" do 
        assert true 
      end 
    end 
    ruby -Itest test/unit/product_test.rb 
    Loaded suite test/unit/product_test 
    Started 
    E 
    Finished in 0.021721 seconds. 
      
      1) Error: 
    test_the_truth(ProductTest): 
    ActiveRecord::StatementInvalid: SQLite3::SQLException: no such table: orders: DELETE FROM "orders" WHERE 1=1 
      
      
    1 tests, 0 assertions, 0 failures, 1 errors 
    rake db:test:prepare 
    (in /home/rubys/git/awdwr/work/depot) 
    ruby -Itest test/unit/product_test.rb 
    Loaded suite test/unit/product_test 
    Started 
    . 
    Finished in 0.049319 seconds. 
      
    1 tests, 1 assertions, 0 failures, 0 errors 
    rake test:units 
    /usr/bin/ruby1.8 -I"lib:test" "/usr/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake/rake_test_loader.rb" "test/unit/line_item_test.rb" "test/unit/product_test.rb" "test/unit/order_test.rb" "test/unit/user_test.rb" "test/unit/helpers/orders_helper_test.rb" "test/unit/helpers/store_helper_test.rb" "test/unit/helpers/admin_helper_test.rb" "test/unit/helpers/products_helper_test.rb" "test/unit/helpers/users_helper_test.rb" "test/unit/helpers/info_helper_test.rb" "test/unit/helpers/line_items_helper_test.rb"  
    (in /home/rubys/git/awdwr/work/depot) 
    Loaded suite /usr/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake/rake_test_loader 
    Started 
    .... 
    Finished in 0.048024 seconds. 
      
    4 tests, 4 assertions, 0 failures, 0 errors 
    edit test/unit/product_test.rb 
    require 'test_helper' 
      
    class ProductTest < ActiveSupport::TestCase 
       
      fixtures :products 
       
      # Replace this with your real tests. 
      test "the truth" do 
        assert true 
      end 
      
      test "invalid with empty attributes" do 
        product = Product.new 
        assert !product.valid? 
        assert product.errors.invalid?(:title) 
        assert product.errors.invalid?(:description) 
        assert product.errors.invalid?(:price) 
        assert product.errors.invalid?(:image_url) 
      end 
      
      test "positive price" do 
        product = Product.new(:title       => "My Book Title", 
                              :description => "yyy", 
                              :image_url   => "zzz.jpg") 
        product.price = -1 
        assert !product.valid? 
        assert_equal "should be at least 0.01", product.errors.on(:price) 
      
        product.price = 0 
        assert !product.valid? 
        assert_equal "should be at least 0.01", product.errors.on(:price) 
      
        product.price = 1 
        assert product.valid? 
      end 
      
      test "image url" do 
        ok = %w{ fred.gif fred.jpg fred.png FRED.JPG FRED.Jpg 
                 http://a.b.c/x/y/z/fred.gif } 
        bad = %w{ fred.doc fred.gif/more fred.gif.more } 
         
        ok.each do |name| 
          product = Product.new(:title       => "My Book Title", 
                                :description => "yyy", 
                                :price       => 1, 
                                :image_url   => name) 
          assert product.valid?, product.errors.full_messages 
        end 
      
        bad.each do |name| 
          product = Product.new(:title => "My Book Title", 
                                :description => "yyy", 
                                :price => 1, 
                                :image_url => name) 
          assert !product.valid?, "saving #{name}" 
        end 
      end 
      
      test "unique title" do 
        product = Product.new(:title       => products(:ruby_book).title, 
                              :description => "yyy",  
                              :price       => 1,  
                              :image_url   => "fred.gif") 
      
        assert !product.save 
        assert_equal "has already been taken", product.errors.on(:title) 
      end 
      
      test "unique title1" do 
        product = Product.new(:title       => products(:ruby_book).title, 
                              :description => "yyy",  
                              :price       => 1,  
                              :image_url   => "fred.gif") 
      
        assert !product.save 
        assert_equal I18n.translate('activerecord.errors.messages.taken'), 
                     product.errors.on(:title) 
      end 
       
    end 
    edit test/fixtures/products.yml 
    ruby_book: 
      title:       Programming Ruby 
      description: Dummy description 
      price:       1234 
      image_url:   ruby.png 
      
    rails_book: 
      title:       Agile Web Development with Rails 
      description: Dummy description 
      price:       2345 
      image_url:   rails.png 
       
    rake test:units 
    /usr/bin/ruby1.8 -I"lib:test" "/usr/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake/rake_test_loader.rb" "test/unit/line_item_test.rb" "test/unit/product_test.rb" "test/unit/order_test.rb" "test/unit/user_test.rb" "test/unit/helpers/orders_helper_test.rb" "test/unit/helpers/store_helper_test.rb" "test/unit/helpers/admin_helper_test.rb" "test/unit/helpers/products_helper_test.rb" "test/unit/helpers/users_helper_test.rb" "test/unit/helpers/info_helper_test.rb" "test/unit/helpers/line_items_helper_test.rb"  
    (in /home/rubys/git/awdwr/work/depot) 
    Loaded suite /usr/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake/rake_test_loader 
    Started 
    ......... 
    Finished in 0.145751 seconds. 
      
    9 tests, 27 assertions, 0 failures, 0 errors 
    edit test/unit/cart_test.rb 
    require 'test_helper' 
     
    class CartTest < ActiveSupport::TestCase 
      fixtures :products 
      def test_add_unique_products 
        cart = Cart.new 
        rails_book = products(:rails_book) 
        ruby_book  = products(:ruby_book) 
        cart.add_product rails_book 
        cart.add_product ruby_book 
        assert_equal 2, cart.items.size 
        assert_equal rails_book.price + ruby_book.price, cart.total_price 
      end 
       
      def test_add_duplicate_product 
        cart = Cart.new 
        rails_book = products(:rails_book) 
        cart.add_product rails_book 
        cart.add_product rails_book 
        assert_equal 2*rails_book.price, cart.total_price 
        assert_equal 1, cart.items.size 
        assert_equal 2, cart.items[0].quantity 
      end  
    end 
    ruby -I test test/unit/cart_test.rb 
    Loaded suite test/unit/cart_test 
    Started 
    .. 
    Finished in 0.048131 seconds. 
      
    2 tests, 5 assertions, 0 failures, 0 errors 
    edit test/unit/cart_test1.rb 
    require 'test_helper' 
     
    class CartTest < ActiveSupport::TestCase 
      fixtures :products 
     
      def setup 
        @cart  = Cart.new 
        @rails = products(:rails_book) 
        @ruby  = products(:ruby_book) 
      end 
       
      def test_add_unique_products 
        @cart.add_product @rails 
        @cart.add_product @ruby 
        assert_equal 2, @cart.items.size 
        assert_equal @rails.price + @ruby.price, @cart.total_price 
      end 
     
      def test_add_duplicate_product 
        @cart.add_product @rails 
        @cart.add_product @rails 
        assert_equal 2*@rails.price, @cart.total_price 
        assert_equal 1, @cart.items.size 
        assert_equal 2, @cart.items[0].quantity 
      end  
    end 
    ruby -I test test/unit/cart_test1.rb 
    Loaded suite test/unit/cart_test1 
    Started 
    .. 
    Finished in 0.049754 seconds. 
      
    2 tests, 5 assertions, 0 failures, 0 errors 
    
      14.3 Functional Testing of Controllers 
     
    edit app/controllers/application_controller.rb 
    class ApplicationController < ActionController::Base 
      layout "store" 
      before_filter :authorize, :except => :login 
      #... 
      
      
    protected 
      def authorize 
        unless User.find_by_id(session[:user_id]) 
          flash[:notice] = "Please log in" 
          redirect_to :controller => 'admin', :action => 'login' 
        end 
      end 
      
      def set_locale 
        session[:locale] = params[:locale] if params[:locale] 
        I18n.locale = session[:locale] || I18n.default_locale 
      
        locale_path = "#{LOCALES_DIRECTORY}#{I18n.locale}.yml" 
      
        unless I18n.load_path.include? locale_path 
          I18n.load_path << locale_path 
          I18n.backend.send(:init_translations) 
        end 
      
      rescue Exception => err 
        logger.error err 
        flash.now[:notice] = "#{I18n.locale} translation not available" 
      
        I18n.load_path -= [locale_path] 
        I18n.locale = session[:locale] = I18n.default_locale 
      end 
    end 
    edit test/functional/admin_controller_test.rb 
    require 'test_helper' 
      
    class AdminControllerTest < ActionController::TestCase 
      
      fixtures :users 
       
      # Replace this with your real tests. 
      test "the truth" do 
        assert true 
      end 
       
      if false 
        test "index" do 
          get :index  
          assert_response :success  
        end 
      end 
      
      test "index without user" do 
        get :index 
        assert_redirected_to :action => "login" 
        assert_equal "Please log in", flash[:notice] 
      end 
      
      test "index with user" do 
        get :index, {}, { :user_id => users(:dave).id } 
        assert_response :success 
        assert_template "index" 
      end 
      
      test "login" do 
        dave = users(:dave) 
        post :login, :name => dave.name, :password => 'secret' 
        assert_redirected_to :action => "index" 
        assert_equal dave.id, session[:user_id] 
      end 
      
      test "bad password" do 
        dave = users(:dave) 
        post :login, :name => dave.name, :password => 'wrong' 
        assert_template "login" 
      end 
    end 
    edit test/fixtures/users.yml 
    <% SALT = "NaCl" unless defined?(SALT) %> 
      
    dave: 
      name: dave 
      salt: <%= SALT %> 
      hashed_password: <%= User.encrypted_password('secret', SALT) %> 
    ruby -I test test/functional/admin_controller_test.rb 
    Loaded suite test/functional/admin_controller_test 
    Started 
    ..... 
    Finished in 0.158866 seconds. 
      
    5 tests, 8 assertions, 0 failures, 0 errors 
    
      14.4 Integration Testing of Applications 
     <"1 tests, 17 assertions, 0 failures, 0 errors"> expected but was
<"      exists  test/integration/">.
Traceback:
  /usr/lib/ruby/gems/1.8/gems/actionpack-2.3.2/lib/action_controller/assertions/selector_assertions.rb:301:in `assert_select'
  ./checkdepot.rb:239
  ./checkdepot.rb:18:in `instance_eval'
  ./checkdepot.rb:18:in `test_14.4_Integration_Testing_of_Applications'
  /usr/lib/ruby/gems/1.8/gems/activesupport-2.3.2/lib/active_support/testing/setup_and_teardown.rb:62:in `__send__'
  /usr/lib/ruby/gems/1.8/gems/activesupport-2.3.2/lib/active_support/testing/setup_and_teardown.rb:62:in `run' 
    ruby script/generate integration_test user_stories 
          exists  test/integration/ 
          create  test/integration/user_stories_test.rb 
    edit test/integration/user_stories_test.rb 
    require 'test_helper' 
      
    class UserStoriesTest < ActionController::IntegrationTest 
      fixtures :products 
      
      # A user goes to the index page. They select a product, adding it to their 
      # cart, and check out, filling in their details on the checkout form. When 
      # they submit, an order is created containing their information, along with a 
      # single line item corresponding to the product they added to their cart. 
       
      test "buying a product" do 
        LineItem.delete_all 
        Order.delete_all 
        ruby_book = products(:ruby_book) 
      
        get "/store/index" 
        assert_response :success 
        assert_template "index" 
         
        xml_http_request :put, "/store/add_to_cart", :id => ruby_book.id 
        assert_response :success  
         
        cart = session[:cart] 
        assert_equal 1, cart.items.size 
        assert_equal ruby_book, cart.items[0].product 
         
        post "/store/checkout" 
        assert_response :success 
        assert_template "checkout" 
         
        post_via_redirect "/store/save_order", 
                          :order => { :name     => "Dave Thomas", 
                                     :address  => "123 The Street", 
                                     :email    => "dave@pragprog.com", 
                                     :pay_type => "check" } 
        assert_response :success 
        assert_template "index" 
        assert_equal 0, session[:cart].items.size 
         
        orders = Order.find(:all) 
        assert_equal 1, orders.size 
        order = orders[0] 
         
        assert_equal "Dave Thomas",       order.name 
        assert_equal "123 The Street",    order.address 
        assert_equal "dave@pragprog.com", order.email 
        assert_equal "check",             order.pay_type 
         
        assert_equal 1, order.line_items.size 
        line_item = order.line_items[0] 
        assert_equal ruby_book, line_item.product 
      end 
    end 
    ruby -I test test/integration/user_stories_test.rb 
    Loaded suite test/integration/user_stories_test 
    Started 
    F 
    Finished in 0.175512 seconds. 
      
      1) Failure: 
    test_buying_a_product(UserStoriesTest) [test/integration/user_stories_test.rb:26]: 
    Expected response to be a <:success>, but was <302> 
      
    1 tests, 3 assertions, 1 failures, 0 errors 
    edit test/integration/dsl_user_stories_test.rb 
    require 'test_helper' 
     
    class DslUserStoriesTest < ActionController::IntegrationTest 
      fixtures :products 
     
     
      DAVES_DETAILS = { 
          :name     => "Dave Thomas", 
          :address  => "123 The Street", 
          :email    => "dave@pragprog.com", 
          :pay_type => "check" 
      } 
     
      MIKES_DETAILS = { 
          :name     => "Mike Clark", 
          :address  => "345 The Avenue", 
          :email    => "mike@pragmaticstudio.com", 
          :pay_type => "cc" 
      } 
       
       
         
      def setup 
        LineItem.delete_all 
        Order.delete_all 
        @ruby_book = products(:ruby_book) 
        @rails_book = products(:rails_book) 
      end  
       
      # A user goes to the store index page. They select a product, 
      # adding it to their cart. They then check out, filling in 
      # their details on the checkout form. When they submit, 
      # an order is created in the database containing 
      # their information, along with a single line item 
      # corresponding to the product they added to their cart. 
       
      def test_buying_a_product 
        dave = regular_user 
        dave.get "/store/index" 
        dave.is_viewing "index" 
        dave.buys_a @ruby_book 
        dave.has_a_cart_containing @ruby_book 
        dave.checks_out DAVES_DETAILS 
        dave.is_viewing "index" 
        check_for_order DAVES_DETAILS, @ruby_book 
      end 
     
      def test_two_people_buying 
        dave = regular_user 
            mike = regular_user 
        dave.buys_a @ruby_book 
            mike.buys_a @rails_book 
        dave.has_a_cart_containing @ruby_book 
        dave.checks_out DAVES_DETAILS 
            mike.has_a_cart_containing @rails_book 
        check_for_order DAVES_DETAILS, @ruby_book 
            mike.checks_out MIKES_DETAILS 
            check_for_order MIKES_DETAILS, @rails_book 
      end 
       
      def regular_user 
        open_session do |user| 
          def user.is_viewing(page) 
            assert_response :success 
            assert_template page 
          end 
         
          def user.buys_a(product) 
            xml_http_request :put, "/store/add_to_cart", :id => product.id 
            assert_response :success  
          end 
         
          def user.has_a_cart_containing(*products) 
            cart = session[:cart] 
            assert_equal products.size, cart.items.size 
            for item in cart.items 
              assert products.include?(item.product) 
            end 
          end 
         
          def user.checks_out(details) 
            post "/store/checkout" 
            assert_response :success 
            assert_template "checkout" 
     
            post_via_redirect "/store/save_order", 
                              :order => { :name     => details[:name], 
                                         :address  => details[:address], 
                                         :email    => details[:email], 
                                         :pay_type => details[:pay_type] 
                                        } 
            assert_response :success 
            assert_template "index" 
            assert_equal 0, session[:cart].items.size 
          end 
        end   
      end 
       
      def check_for_order(details, *products) 
        order = Order.find_by_name(details[:name]) 
        assert_not_nil order 
         
        assert_equal details[:name],     order.name 
        assert_equal details[:address],  order.address 
        assert_equal details[:email],    order.email 
        assert_equal details[:pay_type], order.pay_type 
         
        assert_equal products.size, order.line_items.size 
        for line_item in order.line_items 
          assert products.include?(line_item.product) 
        end 
      end 
    end 
    ruby -I test test/integration/dsl_user_stories_test.rb 
    Loaded suite test/integration/dsl_user_stories_test 
    Started 
    FF 
    Finished in 0.196853 seconds. 
      
      1) Failure: 
    test_buying_a_product(DslUserStoriesTest) 
        [test/integration/dsl_user_stories_test.rb:77:in `buys_a' 
         test/integration/dsl_user_stories_test.rb:44:in `test_buying_a_product']: 
    Expected response to be a <:success>, but was <302> 
      
      2) Failure: 
    test_two_people_buying(DslUserStoriesTest) 
        [test/integration/dsl_user_stories_test.rb:77:in `buys_a' 
         test/integration/dsl_user_stories_test.rb:56:in `test_two_people_buying']: 
    Expected response to be a <:success>, but was <302> 
      
    2 tests, 4 assertions, 2 failures, 0 errors 
    
      14.5 Performance Testing 
     
    mkdir test/fixtures/performance/ 
    edit test/fixtures/performance/products.yml 
    <% 1.upto(1000) do |i| %> 
    product_<%= i %>: 
      id: <%= i %> 
      title: Product Number <%= i %> 
      description: My description 
      image_url: product.gif 
      price: 1234 
    <% end %> 
    edit test/performance/order_speed_test.rb 
    require 'test_helper' 
    require 'store_controller' 
     
    class OrderSpeedTest < ActionController::TestCase 
      tests StoreController 
       
      DAVES_DETAILS = { 
          :name     => "Dave Thomas", 
          :address  => "123 The Street", 
          :email    => "dave@pragprog.com", 
          :pay_type => "check" 
      } 
       
      self.fixture_path = File.join(File.dirname(__FILE__), "../fixtures/performance") 
      fixtures :products 
       
     
      def test_100_orders 
        Order.delete_all 
        LineItem.delete_all 
     
        @controller.logger.silence do 
          elapsed_time = Benchmark.realtime do 
            100.downto(1) do |prd_id| 
              cart = Cart.new 
              cart.add_product(Product.find(prd_id)) 
              post :save_order,  
                   { :order => DAVES_DETAILS }, 
                   { :cart  => cart } 
              assert_redirected_to :action => :index 
            end          
          end        
          assert_equal 100, Order.count 
          assert elapsed_time < 3.00 
        end 
      end 
    end 
    ruby -I test test/performance/order_speed_test.rb 
    Loaded suite test/performance/order_speed_test 
    Started 
    . 
    Finished in 1.958994 seconds. 
      
    1 tests, 102 assertions, 0 failures, 0 errors 
    edit app/models/user.rb 
    require 'digest/sha1' 
      
    class User < ActiveRecord::Base 
       
      validates_presence_of     :name 
      validates_uniqueness_of   :name 
      
      attr_accessor :password_confirmation 
      validates_confirmation_of :password 
      
      validate :password_non_blank 
       
      def self.authenticate(name, password) 
        user = self.find_by_name(name) 
        if user 
          expected_password = encrypted_password(password, user.salt) 
          if user.hashed_password != expected_password 
            user = nil 
          end 
        end 
        user 
      end 
       
      # 'password' is a virtual attribute 
      def password 
        @password 
      end 
       
      def password=(pwd) 
        @password = pwd 
        return if pwd.blank? 
        create_new_salt 
        self.hashed_password = User.encrypted_password(self.password, self.salt) 
      end 
       
      def after_destroy 
        if User.count.zero? 
          raise "Can't delete last user" 
        end 
      end      
      
    private 
      
      def password_non_blank 
        errors.add(:password, "Missing password") if hashed_password.blank? 
      end 
       
      def create_new_salt 
        self.salt = self.object_id.to_s + rand.to_s 
      end 
       
      def self.encrypted_password(password, salt) 
        100000.times { Math.sin(1)} 
        string_to_hash = password + "wibble" + salt 
        Digest::SHA1.hexdigest(string_to_hash) 
      end 
    end 
    ruby script/performance/benchmarker "User.encrypted_password(\"secret\", \"salt\")" 
                user     system      total        real 
    #1      0.200000   0.000000   0.200000 (  0.219773) 
    ruby script/performance/profiler "User.encrypted_password(\"secret\", \"salt\")" 
    Loading Rails... 
    Using the standard Ruby profiler. 
      %   cumulative   self              self     total 
     time   seconds   seconds    calls  ms/call  ms/call  name 
     71.06     3.56      3.56        1  3560.00  4880.00  Integer#times 
     26.35     4.88      1.32   100000     0.01     0.01  Math.sin 
      1.00     4.93      0.05        5    10.00    10.00  Array#map 
      0.60     4.96      0.03        4     7.50     7.50  Array#select 
      0.40     4.98      0.02        1    20.00    80.00  Kernel.load_without_new_constant_marking 
      0.20     4.99      0.01        8     1.25     2.50  ActiveSupport::Dependencies.qualified_const_defined? 
      0.20     5.00      0.01       11     0.91     0.91  Enumerable.inject 
      0.20     5.01      0.01        1    10.00    10.00  ActiveRecord::Base#inherited 
      0.00     5.01      0.00        1     0.00     0.00  NilClass#nil? 
      0.00     5.01      0.00        1     0.00     0.00  Digest::Class#hexdigest 
      0.00     5.01      0.00        1     0.00     0.00  String#downcase 
      0.00     5.01      0.00        4     0.00     0.00  Array#<< 
      0.00     5.01      0.00        1     0.00     0.00  ActiveRecord::Base#respond_to? 
      0.00     5.01      0.00        1     0.00     0.00  ActiveRecord::DynamicFinderMatch#initialize 
      0.00     5.01      0.00        1     0.00     0.00  Kernel.require 
      0.00     5.01      0.00        5     0.00     0.00  Array#initialize 
      0.00     5.01      0.00        5     0.00     0.00  Array#flatten 
      0.00     5.01      0.00        4     0.00     0.00  ActiveSupport::Callbacks::CallbackChain#extract_options 
      0.00     5.01      0.00        1     0.00   130.00  ActiveSupport::Dependencies::ModuleConstMissing.const_missing 
      0.00     5.01      0.00        2     0.00     0.00  Module#attr_accessor 
      0.00     5.01      0.00        1     0.00     0.00  ActiveRecord::Validations::ClassMethods.validates_presence_of 
      0.00     5.01      0.00        3     0.00     0.00  Module#=== 
      0.00     5.01      0.00        2     0.00    85.00  ActiveSupport::Dependencies.new_constants_in 
      0.00     5.01      0.00       13     0.00     0.00  Hash#[] 
      0.00     5.01      0.00        8     0.00     0.00  Regexp#escape 
      0.00     5.01      0.00       10     0.00     0.00  Array#concat 
      0.00     5.01      0.00        9     0.00     0.00  ActiveSupport::Dependencies.logger 
      0.00     5.01      0.00        2     0.00     0.00  Class#inherited 
      0.00     5.01      0.00        8     0.00     0.00  Hash#update 
      0.00     5.01      0.00        4     0.00     0.00  Kernel.dup 
      0.00     5.01      0.00        3     0.00     0.00  Class#inheritable_attributes 
      0.00     5.01      0.00        3     0.00     0.00  File#join 
      0.00     5.01      0.00       18     0.00     0.00  Kernel.object_id 
      0.00     5.01      0.00       12     0.00     0.00  String#split 
      0.00     5.01      0.00       12     0.00     0.00  String#empty? 
      0.00     5.01      0.00        1     0.00     0.00  ActiveRecord::DynamicScopeMatch#match 
      0.00     5.01      0.00       18     0.00     0.00  Kernel.is_a? 
      0.00     5.01      0.00        1     0.00   130.00  ActiveSupport::Dependencies.require_or_load 
      0.00     5.01      0.00        9     0.00     0.00  Array#last 
      0.00     5.01      0.00        4     0.00     0.00  ActiveSupport::Inflector.constantize 
      0.00     5.01      0.00       20     0.00     0.00  Module#constants 
      0.00     5.01      0.00        4     0.00     0.00  Object#duplicable? 
      0.00     5.01      0.00        2     0.00     0.00  Array#delete_if 
      0.00     5.01      0.00        1     0.00     0.00  Kernel.gem_original_require 
      0.00     5.01      0.00        1     0.00     0.00  ActiveSupport::Dependencies.load_once_paths 
      0.00     5.01      0.00        9     0.00     0.00  Array#extract_options! 
      0.00     5.01      0.00        1     0.00  5010.00  Object#profile_me 
      0.00     5.01      0.00        9     0.00     0.00  ActiveSupport::Dependencies.log_activity 
      0.00     5.01      0.00       11     0.00     0.00  File#expand_path 
      0.00     5.01      0.00        1     0.00  4880.00  User#encrypted_password 
      0.00     5.01      0.00        2     0.00     0.00  Set#<< 
      0.00     5.01      0.00       14     0.00     0.00  Module#const_defined? 
      0.00     5.01      0.00       21     0.00     0.00  Module#const_get 
      0.00     5.01      0.00        5     0.00     0.00  Symbol#to_s 
      0.00     5.01      0.00        1     0.00     0.00  String#tr 
      0.00     5.01      0.00        3     0.00     0.00  ActiveSupport::Dependencies.loaded 
      0.00     5.01      0.00        1     0.00     0.00  ActiveSupport::Dependencies.warnings_on_first_load 
      0.00     5.01      0.00        1     0.00     0.00  Digest::Base#finish 
      0.00     5.01      0.00        1     0.00     0.00  Object#initialize 
      0.00     5.01      0.00        1     0.00   120.00  ActiveSupport::Dependencies.load_file 
      0.00     5.01      0.00        4     0.00     0.00  ActiveRecord::Base#validate 
      0.00     5.01      0.00        4     0.00     0.00  Array#map! 
      0.00     5.01      0.00        5     0.00     0.00  Symbol#=== 
      0.00     5.01      0.00        2     0.00     0.00  Kernel.instance_variable_set 
      0.00     5.01      0.00        1     0.00    10.00  ActiveSupport::Dependencies.loadable_constants_for_path 
      0.00     5.01      0.00        1     0.00    50.00  ActiveSupport::Dependencies::Loadable.require 
      0.00     5.01      0.00       12     0.00     0.00  Class#new 
      0.00     5.01      0.00        1     0.00     0.00  Array#uniq 
      0.00     5.01      0.00        1     0.00     0.00  ActiveSupport::Dependencies.history 
      0.00     5.01      0.00        2     0.00     0.00  Array#initialize_copy 
      0.00     5.01      0.00        3     0.00     0.00  Array#* 
      0.00     5.01      0.00        1     0.00     0.00  ActiveSupport::Inflector.underscore 
      0.00     5.01      0.00        1     0.00     0.00  ActiveSupport::Dependencies.search_for_file 
      0.00     5.01      0.00        2     0.00     0.00  Kernel.singleton_method_added 
      0.00     5.01      0.00        6     0.00     0.00  String#[] 
      0.00     5.01      0.00        1     0.00     0.00  ActiveRecord::DynamicScopeMatch#initialize 
      0.00     5.01      0.00        5     0.00     0.00  Array#empty? 
      0.00     5.01      0.00        1     0.00     0.00  Observable.notify_observers 
      0.00     5.01      0.00        5     0.00     0.00  Hash#default 
      0.00     5.01      0.00        7     0.00     0.00  String#== 
      0.00     5.01      0.00        2     0.00     0.00  Kernel.hash 
      0.00     5.01      0.00        4     0.00     7.50  Module#local_constants 
      0.00     5.01      0.00        1     0.00     0.00  ActiveSupport::Dependencies.qualified_name_for 
      0.00     5.01      0.00        1     0.00     0.00  ActiveRecord::Validations::ClassMethods.validates_uniqueness_of 
      0.00     5.01      0.00        5     0.00     0.00  ActiveSupport::Dependencies.log_call 
      0.00     5.01      0.00        4     0.00     0.00  Array#flatten! 
      0.00     5.01      0.00        9     0.00     0.00  Module#blank_slate_method_added 
      0.00     5.01      0.00        1     0.00     0.00  Array#uniq! 
      0.00     5.01      0.00        2     0.00     0.00  ActiveSupport::Dependencies.mechanism 
      0.00     5.01      0.00        4     0.00     0.00  ActiveSupport::Dependencies.log 
      0.00     5.01      0.00        9     0.00     0.00  Object#method_added 
      0.00     5.01      0.00        3     0.00     0.00  Kernel.send 
      0.00     5.01      0.00        2     0.00     0.00  Array#blank? 
      0.00     5.01      0.00        1     0.00     0.00  ActiveSupport::Dependencies.to_constant_name 
      0.00     5.01      0.00        7     0.00     0.00  Array#include? 
      0.00     5.01      0.00        1     0.00   130.00  ActiveSupport::Dependencies.load_missing_constant 
      0.00     5.01      0.00        2     0.00     0.00  ActiveSupport::Dependencies.autoloaded_constants 
      0.00     5.01      0.00        2     0.00     0.00  ActiveSupport::Inflector.camelize 
      0.00     5.01      0.00        7     0.00     0.00  String#gsub 
      0.00     5.01      0.00        1     0.00     0.00  ActiveSupport::Dependencies.load_once_path? 
      0.00     5.01      0.00        1     0.00     0.00  Digest::Base#update 
      0.00     5.01      0.00        3     0.00     0.00  ActiveRecord::Validations::ClassMethods.validation_method 
      0.00     5.01      0.00        2     0.00     0.00  Kernel.== 
      0.00     5.01      0.00      757     0.00     0.00  Hash#key? 
      0.00     5.01      0.00        3     0.00     0.00  File#file? 
      0.00     5.01      0.00        2     0.00     0.00  ActiveSupport::Dependencies.load_paths 
      0.00     5.01      0.00        2     0.00     0.00  Digest::Base#reset 
      0.00     5.01      0.00        2     0.00     0.00  Hash#symbolize_keys 
      0.00     5.01      0.00        4     0.00    20.00  Module#local_constant_names 
      0.00     5.01      0.00       10     0.00     0.00  ActiveSupport::Dependencies.uninherited_const_defined? 
      0.00     5.01      0.00       36     0.00     0.00  Array#each 
      0.00     5.01      0.00        1     0.00     0.00  NameError#initialize 
      0.00     5.01      0.00        6     0.00     0.00  Mutex#synchronize 
      0.00     5.01      0.00        1     0.00     0.00  Digest::Class#digest 
      0.00     5.01      0.00        1     0.00     0.00  Digest::Instance.digest 
      0.00     5.01      0.00        2     0.00     0.00  String#+ 
      0.00     5.01      0.00        2     0.00     0.00  Kernel.equal? 
      0.00     5.01      0.00        1     0.00     0.00  Array#compact 
      0.00     5.01      0.00       10     0.00     0.00  Fixnum#== 
      0.00     5.01      0.00        1     0.00   130.00  ActiveSupport::Dependencies::ClassConstMissing.const_missing 
      0.00     5.01      0.00        1     0.00     0.00  String#underscore 
      0.00     5.01      0.00        3     0.00     0.00  Hash#each 
      0.00     5.01      0.00        4     0.00     0.00  Regexp#=== 
      0.00     5.01      0.00        6     0.00     0.00  ActiveSupport::Dependencies.constant_watch_stack 
      0.00     5.01      0.00        1     0.00     0.00  ActiveRecord::Observing::ClassMethods.inherited 
      0.00     5.01      0.00       12     0.00     0.00  Array#first 
      0.00     5.01      0.00        2     0.00     0.00  Array#- 
      0.00     5.01      0.00        6     0.00     0.00  Module#name 
      0.00     5.01      0.00        1     0.00     0.00  ActiveRecord::Validations::ClassMethods.validates_confirmation_of 
      0.00     5.01      0.00        2     0.00     0.00  Symbol#to_sym 
      0.00     5.01      0.00        2     0.00     0.00  Hash#initialize_copy 
      0.00     5.01      0.00        4     0.00     0.00  String#blank? 
      0.00     5.01      0.00        5     0.00     0.00  Array#pop 
      0.00     5.01      0.00        4     0.00     0.00  Module#ancestors 
      0.00     5.01      0.00        1     0.00     0.00  Module#private 
      0.00     5.01      0.00       30     0.00     0.00  Module#== 
      0.00     5.01      0.00        2     0.00     0.00  Hash#include? 
      0.00     5.01      0.00        2     0.00     0.00  Set#include? 
      0.00     5.01      0.00        2     0.00     0.00  String#size 
      0.00     5.01      0.00        4     0.00     0.00  Kernel.block_given? 
      0.00     5.01      0.00        1     0.00     0.00  Exception#initialize 
      0.00     5.01      0.00        1     0.00     0.00  Observable.changed 
      0.00     5.01      0.00        2     0.00     0.00  ActiveSupport::Dependencies.load? 
      0.00     5.01      0.00        4     0.00     0.00  ActiveSupport::Callbacks::CallbackChain#build 
      0.00     5.01      0.00        3     0.00     0.00  String#upcase 
      0.00     5.01      0.00      765     0.00     0.00  String#to_s 
      0.00     5.01      0.00        2     0.00     0.00  Kernel.respond_to? 
      0.00     5.01      0.00        6     0.00     0.00  ActiveSupport::Dependencies.constant_watch_stack_mutex 
      0.00     5.01      0.00        1     0.00     0.00  TrueClass#duplicable? 
      0.00     5.01      0.00        1     0.00     0.00  Enumerable.any? 
      0.00     5.01      0.00       12     0.00     0.00  Hash#[]= 
      0.00     5.01      0.00        1     0.00     0.00  ActiveRecord::DynamicFinderMatch#match 
      0.00     5.01      0.00        2     0.00     0.00  ActiveRecord::Validations::ClassMethods.validates_each 
      0.00     5.01      0.00        4     0.00     0.00  ActiveSupport::Callbacks::Callback#initialize 
      0.00     5.01      0.00        2     0.00     0.00  String#camelize 
      0.00     5.01      0.00       10     0.00    10.00  Array#collect 
      0.00     5.01      0.00        1     0.00  5010.00  #toplevel 
    edit app/models/user.rb 
    
      15 Rails In Depth 
     
    rake db:version 
    (in /home/rubys/git/awdwr/work/depot) 
    Current version: 20080601000007 
    edit lib/tasks/db_schema_migrations.rake 
    namespace :db do 
      desc "Prints the migrated versions" 
      task :schema_migrations => :environment do 
        puts ActiveRecord::Base.connection.select_values( 
          'select version from schema_migrations order by version' ) 
      end 
    end 
    rake db:schema_migrations 
    (in /home/rubys/git/awdwr/work/depot) 
    20080601000001 
    20080601000002 
    20080601000003 
    20080601000004 
    20080601000005 
    20080601000006 
    20080601000007 
    ls log 
    development.log 
    development.log.0 
    production.log 
    server.log 
    test.log 
    find script -type f 
    script/plugin 
    script/server 
    script/console 
    script/generate 
    script/dbconsole 
    script/performance/profiler 
    script/performance/benchmarker 
    script/destroy 
    script/about 
    script/runner 
    echo "puts $:" | ruby script/console 
    >> puts $: 
    /home/rubys/git/awdwr/work/depot/vendor/rails/activeresource/lib/../../activesupport/lib 
    /home/rubys/git/awdwr/work/depot/vendor/rails/actionmailer/lib/action_mailer/vendor/tmail-1.2.3 
    /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/../../activesupport/lib 
    /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre 
    /home/rubys/git/awdwr/work/depot/vendor/rails/activerecord/lib/../../activesupport/lib 
    /home/rubys/git/awdwr/work/depot/vendor/rails/activesupport/lib/active_support/vendor/i18n-0.1.3/lib 
    /home/rubys/git/awdwr/work/depot/vendor/rails/activesupport/lib/active_support/vendor/tzinfo-0.3.12 
    /home/rubys/git/awdwr/work/depot/vendor/rails/activesupport/lib/active_support/vendor/memcache-client-1.6.5 
    /home/rubys/git/awdwr/work/depot/vendor/rails/activesupport/lib/active_support/vendor/builder-2.1.2 
    /home/rubys/git/awdwr/work/depot/app/controllers/ 
    /home/rubys/git/awdwr/work/depot/app 
    /home/rubys/git/awdwr/work/depot/app/models 
    /home/rubys/git/awdwr/work/depot/app/controllers 
    /home/rubys/git/awdwr/work/depot/app/helpers 
    /home/rubys/git/awdwr/work/depot/lib 
    /home/rubys/git/awdwr/work/depot/vendor 
    /home/rubys/git/awdwr/work/depot/config/../vendor/rails/railties/lib/../builtin/rails_info/ 
    /home/rubys/git/awdwr/work/depot/vendor/rails/railties 
    /home/rubys/git/awdwr/work/depot/vendor/rails/railties/lib 
    /home/rubys/git/awdwr/work/depot/vendor/rails/activesupport/lib 
    /home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib 
    /home/rubys/git/awdwr/work/depot/vendor/rails/activerecord/lib 
    /home/rubys/git/awdwr/work/depot/vendor/rails/actionmailer/lib 
    /home/rubys/git/awdwr/work/depot/vendor/rails/activeresource/lib 
    /home/rubys/git/awdwr/work/depot/config/../vendor/rails/railties/lib 
    /usr/lib/ruby/gems/1.8/gems/activesupport-2.3.2/bin 
    /usr/lib/ruby/gems/1.8/gems/activesupport-2.3.2/lib 
    /usr/local/lib/site_ruby/1.8 
    /usr/local/lib/site_ruby/1.8/i486-linux 
    /usr/local/lib/site_ruby/1.8/i386-linux 
    /usr/local/lib/site_ruby 
    /usr/lib/ruby/vendor_ruby/1.8 
    /usr/lib/ruby/vendor_ruby/1.8/i486-linux 
    /usr/lib/ruby/vendor_ruby 
    /usr/lib/ruby/1.8 
    /usr/lib/ruby/1.8/i486-linux 
    /usr/lib/ruby/1.8/i386-linux 
    . 
    => nil 
    >>  
    
      16 Active Support 
     
    ruby /home/rubys/git/rails/railties/bin/rails namelist 
          create   
          create  app/controllers 
          create  app/helpers 
          create  app/models 
          create  app/views/layouts 
          create  config/environments 
          create  config/initializers 
          create  config/locales 
          create  db 
          create  doc 
          create  lib 
          create  lib/tasks 
          create  log 
          create  public/images 
          create  public/javascripts 
          create  public/stylesheets 
          create  script/performance 
          create  test/fixtures 
          create  test/functional 
          create  test/integration 
          create  test/performance 
          create  test/unit 
          create  vendor 
          create  vendor/plugins 
          create  tmp/sessions 
          create  tmp/sockets 
          create  tmp/cache 
          create  tmp/pids 
          create  Rakefile 
          create  README 
          create  app/controllers/application_controller.rb 
          create  app/helpers/application_helper.rb 
          create  config/database.yml 
          create  config/routes.rb 
          create  config/locales/en.yml 
          create  db/seeds.rb 
          create  config/initializers/backtrace_silencers.rb 
          create  config/initializers/inflections.rb 
          create  config/initializers/mime_types.rb 
          create  config/initializers/new_rails_defaults.rb 
          create  config/initializers/session_store.rb 
          create  config/environment.rb 
          create  config/boot.rb 
          create  config/environments/production.rb 
          create  config/environments/development.rb 
          create  config/environments/test.rb 
          create  script/about 
          create  script/console 
          create  script/dbconsole 
          create  script/destroy 
          create  script/generate 
          create  script/runner 
          create  script/server 
          create  script/plugin 
          create  script/performance/benchmarker 
          create  script/performance/profiler 
          create  test/test_helper.rb 
          create  test/performance/browsing_test.rb 
          create  public/404.html 
          create  public/422.html 
          create  public/500.html 
          create  public/index.html 
          create  public/favicon.ico 
          create  public/robots.txt 
          create  public/images/rails.png 
          create  public/javascripts/prototype.js 
          create  public/javascripts/effects.js 
          create  public/javascripts/dragdrop.js 
          create  public/javascripts/controls.js 
          create  public/javascripts/application.js 
          create  doc/README_FOR_APP 
          create  log/server.log 
          create  log/production.log 
          create  log/development.log 
          create  log/test.log 
    ln -s /home/rubys/git/rails vendor/rails 
    restart 
    ruby script/generate model person name:string 
          exists  app/models/ 
          exists  test/unit/ 
          exists  test/fixtures/ 
          create  app/models/person.rb 
          create  test/unit/person_test.rb 
          create  test/fixtures/people.yml 
          create  db/migrate 
          create  db/migrate/20090518123527_create_people.rb 
    rake db:migrate 
    mv 20090518123527_create_people.rb 20080601000001_create_people.rb 
    (in /home/rubys/git/awdwr/work/namelist) 
    ==  CreatePeople: migrating =================================================== 
    -- create_table(:people) 
       -> 0.0012s 
    ==  CreatePeople: migrated (0.0013s) ========================================== 
      
    edit app/controllers/people_controller.rb 
    class PeopleController < ApplicationController 
     
      def index 
        @person = Person.new(params[:person]) 
        @person.save! if request.post? 
        @people = Person.find(:all) 
      end 
    end 
    edit app/views/layouts/people.html.erb 
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"  
                          "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> 
      <head> 
        <meta http-equiv="content-type" content="text/html; charset=UTF-8"></meta> 
        <title>My Name List</title> 
      </head> 
      <body> 
        <%= yield :layout %> 
      </body> 
    </html> 
    mkdir app/views/people 
    edit app/views/people/index.html.erb 
    <table border="1"> 
      <tr> 
        <th>Name</th><th>bytes</th><th>chars</th><th>reversed</th> 
      </tr> 
      <% for person in @people %> 
        <tr>   
          <td><%=h person.name %></td> 
          <td><%= person.name.length %></td> 
          <td><%= person.name.chars.length %></td> 
          <td><%=h person.name.chars.reverse %></td> 
        </tr> 
      <% end %> 
    </table> 
     
    <% form_for :person do |form| %> 
      New name: <%= form.text_field :name %> 
      <%= submit_tag "Add" %> 
    <% end %> 
    get /people 
    
Routing Error 
No route matches "/people" with {:method=>:get} 
     
    
    get /people 
    
Routing Error 
No route matches "/people" with {:method=>:get} 
     
    
    sqlite3> select name,length(name) from people where name like 'G%' 
    
      17 Migration 
     
    ruby /home/rubys/git/rails/railties/bin/rails migration 
          create   
          create  app/controllers 
          create  app/helpers 
          create  app/models 
          create  app/views/layouts 
          create  config/environments 
          create  config/initializers 
          create  config/locales 
          create  db 
          create  doc 
          create  lib 
          create  lib/tasks 
          create  log 
          create  public/images 
          create  public/javascripts 
          create  public/stylesheets 
          create  script/performance 
          create  test/fixtures 
          create  test/functional 
          create  test/integration 
          create  test/performance 
          create  test/unit 
          create  vendor 
          create  vendor/plugins 
          create  tmp/sessions 
          create  tmp/sockets 
          create  tmp/cache 
          create  tmp/pids 
          create  Rakefile 
          create  README 
          create  app/controllers/application_controller.rb 
          create  app/helpers/application_helper.rb 
          create  config/database.yml 
          create  config/routes.rb 
          create  config/locales/en.yml 
          create  db/seeds.rb 
          create  config/initializers/backtrace_silencers.rb 
          create  config/initializers/inflections.rb 
          create  config/initializers/mime_types.rb 
          create  config/initializers/new_rails_defaults.rb 
          create  config/initializers/session_store.rb 
          create  config/environment.rb 
          create  config/boot.rb 
          create  config/environments/production.rb 
          create  config/environments/development.rb 
          create  config/environments/test.rb 
          create  script/about 
          create  script/console 
          create  script/dbconsole 
          create  script/destroy 
          create  script/generate 
          create  script/runner 
          create  script/server 
          create  script/plugin 
          create  script/performance/benchmarker 
          create  script/performance/profiler 
          create  test/test_helper.rb 
          create  test/performance/browsing_test.rb 
          create  public/404.html 
          create  public/422.html 
          create  public/500.html 
          create  public/index.html 
          create  public/favicon.ico 
          create  public/robots.txt 
          create  public/images/rails.png 
          create  public/javascripts/prototype.js 
          create  public/javascripts/effects.js 
          create  public/javascripts/dragdrop.js 
          create  public/javascripts/controls.js 
          create  public/javascripts/application.js 
          create  doc/README_FOR_APP 
          create  log/server.log 
          create  log/production.log 
          create  log/development.log 
          create  log/test.log 
    ln -s /home/rubys/git/rails vendor/rails 
    cp -rpv /home/rubys/git/awdwr/plugins/* vendor/plugins/ 
    `/home/rubys/git/awdwr/plugins/MANIFEST' -> `vendor/plugins/MANIFEST' 
    `/home/rubys/git/awdwr/plugins/acts_as_list' -> `vendor/plugins/acts_as_list' 
    `/home/rubys/git/awdwr/plugins/acts_as_list/lib' -> `vendor/plugins/acts_as_list/lib' 
    `/home/rubys/git/awdwr/plugins/acts_as_list/lib/active_record' -> `vendor/plugins/acts_as_list/lib/active_record' 
    `/home/rubys/git/awdwr/plugins/acts_as_list/lib/active_record/acts' -> `vendor/plugins/acts_as_list/lib/active_record/acts' 
    `/home/rubys/git/awdwr/plugins/acts_as_list/lib/active_record/acts/list.rb' -> `vendor/plugins/acts_as_list/lib/active_record/acts/list.rb' 
    `/home/rubys/git/awdwr/plugins/acts_as_list/init.rb' -> `vendor/plugins/acts_as_list/init.rb' 
    `/home/rubys/git/awdwr/plugins/acts_as_list/test' -> `vendor/plugins/acts_as_list/test' 
    `/home/rubys/git/awdwr/plugins/acts_as_list/test/list_test.rb' -> `vendor/plugins/acts_as_list/test/list_test.rb' 
    `/home/rubys/git/awdwr/plugins/acts_as_list/README' -> `vendor/plugins/acts_as_list/README' 
    `/home/rubys/git/awdwr/plugins/acts_as_tree' -> `vendor/plugins/acts_as_tree' 
    `/home/rubys/git/awdwr/plugins/acts_as_tree/Rakefile' -> `vendor/plugins/acts_as_tree/Rakefile' 
    `/home/rubys/git/awdwr/plugins/acts_as_tree/lib' -> `vendor/plugins/acts_as_tree/lib' 
    `/home/rubys/git/awdwr/plugins/acts_as_tree/lib/active_record' -> `vendor/plugins/acts_as_tree/lib/active_record' 
    `/home/rubys/git/awdwr/plugins/acts_as_tree/lib/active_record/acts' -> `vendor/plugins/acts_as_tree/lib/active_record/acts' 
    `/home/rubys/git/awdwr/plugins/acts_as_tree/lib/active_record/acts/tree.rb' -> `vendor/plugins/acts_as_tree/lib/active_record/acts/tree.rb' 
    `/home/rubys/git/awdwr/plugins/acts_as_tree/init.rb' -> `vendor/plugins/acts_as_tree/init.rb' 
    `/home/rubys/git/awdwr/plugins/acts_as_tree/test' -> `vendor/plugins/acts_as_tree/test' 
    `/home/rubys/git/awdwr/plugins/acts_as_tree/test/abstract_unit.rb' -> `vendor/plugins/acts_as_tree/test/abstract_unit.rb' 
    `/home/rubys/git/awdwr/plugins/acts_as_tree/test/acts_as_tree_test.rb' -> `vendor/plugins/acts_as_tree/test/acts_as_tree_test.rb' 
    `/home/rubys/git/awdwr/plugins/acts_as_tree/test/schema.rb' -> `vendor/plugins/acts_as_tree/test/schema.rb' 
    `/home/rubys/git/awdwr/plugins/acts_as_tree/test/database.yml' -> `vendor/plugins/acts_as_tree/test/database.yml' 
    `/home/rubys/git/awdwr/plugins/acts_as_tree/test/fixtures' -> `vendor/plugins/acts_as_tree/test/fixtures' 
    `/home/rubys/git/awdwr/plugins/acts_as_tree/test/fixtures/mixin.rb' -> `vendor/plugins/acts_as_tree/test/fixtures/mixin.rb' 
    `/home/rubys/git/awdwr/plugins/acts_as_tree/test/fixtures/mixins.yml' -> `vendor/plugins/acts_as_tree/test/fixtures/mixins.yml' 
    `/home/rubys/git/awdwr/plugins/acts_as_tree/README' -> `vendor/plugins/acts_as_tree/README' 
    `/home/rubys/git/awdwr/plugins/annotate_models' -> `vendor/plugins/annotate_models' 
    `/home/rubys/git/awdwr/plugins/annotate_models/tasks' -> `vendor/plugins/annotate_models/tasks' 
    `/home/rubys/git/awdwr/plugins/annotate_models/tasks/annotate_models_tasks.rake' -> `vendor/plugins/annotate_models/tasks/annotate_models_tasks.rake' 
    `/home/rubys/git/awdwr/plugins/annotate_models/lib' -> `vendor/plugins/annotate_models/lib' 
    `/home/rubys/git/awdwr/plugins/annotate_models/lib/annotate_models.rb' -> `vendor/plugins/annotate_models/lib/annotate_models.rb' 
    `/home/rubys/git/awdwr/plugins/annotate_models/ChangeLog' -> `vendor/plugins/annotate_models/ChangeLog' 
    `/home/rubys/git/awdwr/plugins/annotate_models/README' -> `vendor/plugins/annotate_models/README' 
    `/home/rubys/git/awdwr/plugins/country_select' -> `vendor/plugins/country_select' 
    `/home/rubys/git/awdwr/plugins/country_select/lib' -> `vendor/plugins/country_select/lib' 
    `/home/rubys/git/awdwr/plugins/country_select/lib/country_select.rb' -> `vendor/plugins/country_select/lib/country_select.rb' 
    `/home/rubys/git/awdwr/plugins/country_select/MIT-LICENSE' -> `vendor/plugins/country_select/MIT-LICENSE' 
    `/home/rubys/git/awdwr/plugins/country_select/init.rb' -> `vendor/plugins/country_select/init.rb' 
    `/home/rubys/git/awdwr/plugins/country_select/uninstall.rb' -> `vendor/plugins/country_select/uninstall.rb' 
    `/home/rubys/git/awdwr/plugins/country_select/install.rb' -> `vendor/plugins/country_select/install.rb' 
    `/home/rubys/git/awdwr/plugins/country_select/README' -> `vendor/plugins/country_select/README' 
    restart 
    cp -v -r ../depot/db/* db/ 
    `../depot/db/development.sqlite3' -> `db/development.sqlite3' 
    `../depot/db/migrate' -> `db/migrate' 
    `../depot/db/migrate/20080601000005_create_orders.rb' -> `db/migrate/20080601000005_create_orders.rb' 
    `../depot/db/migrate/20080601000004_create_sessions.rb' -> `db/migrate/20080601000004_create_sessions.rb' 
    `../depot/db/migrate/20080601000003_add_test_data.rb' -> `db/migrate/20080601000003_add_test_data.rb' 
    `../depot/db/migrate/20080601000007_create_users.rb' -> `db/migrate/20080601000007_create_users.rb' 
    `../depot/db/migrate/20080601000002_add_price_to_product.rb' -> `db/migrate/20080601000002_add_price_to_product.rb' 
    `../depot/db/migrate/20080601000001_create_products.rb' -> `db/migrate/20080601000001_create_products.rb' 
    `../depot/db/migrate/20080601000006_create_line_items.rb' -> `db/migrate/20080601000006_create_line_items.rb' 
    `../depot/db/schema.rb' -> `db/schema.rb' 
    `../depot/db/seeds.rb' -> `db/seeds.rb' 
    `../depot/db/test.sqlite3' -> `db/test.sqlite3' 
    cp -v -r ../depot/app/models/* app/models/ 
    `../depot/app/models/cart.rb' -> `app/models/cart.rb' 
    `../depot/app/models/cart_item.rb' -> `app/models/cart_item.rb' 
    `../depot/app/models/line_item.rb' -> `app/models/line_item.rb' 
    `../depot/app/models/order.rb' -> `app/models/order.rb' 
    `../depot/app/models/product.rb' -> `app/models/product.rb' 
    `../depot/app/models/user.rb' -> `app/models/user.rb' 
    ruby script/generate model discount 
          exists  app/models/ 
          exists  test/unit/ 
          exists  test/fixtures/ 
          create  app/models/discount.rb 
          create  test/unit/discount_test.rb 
          create  test/fixtures/discounts.yml 
          exists  db/migrate 
          create  db/migrate/20090518123539_create_discounts.rb 
    ruby script/generate migration add_status_to_user status:string 
          exists  db/migrate 
          create  db/migrate/20090518123540_add_status_to_user.rb 
    cp -v /home/rubys/git/awdwr/data/migrate/020* db/migrate 
    `/home/rubys/git/awdwr/data/migrate/020_add_email_to_orders.rb' -> `db/migrate/020_add_email_to_orders.rb' 
    rake db:migrate 
    mv 020_add_email_to_orders.rb 20080601000008_add_email_to_orders.rb 
    mv 20090518123539_create_discounts.rb 20080601000009_create_discounts.rb 
    mv 20090518123540_add_status_to_user.rb 20080601000010_add_status_to_user.rb 
    (in /home/rubys/git/awdwr/work/migration) 
    ==  AddEmailToOrders: migrating =============================================== 
    -- add_column(:orders, :e_mail, :string) 
       -> 0.0008s 
    ==  AddEmailToOrders: migrated (0.0009s) ====================================== 
      
    ==  CreateDiscounts: migrating ================================================ 
    -- create_table(:discounts) 
       -> 0.0011s 
    ==  CreateDiscounts: migrated (0.0012s) ======================================= 
      
    ==  AddStatusToUser: migrating ================================================ 
    -- add_column(:users, :status, :string) 
       -> 0.0007s 
    ==  AddStatusToUser: migrated (0.0008s) ======================================= 
      
    rake annotate_models 
    (in /home/rubys/git/awdwr/work/migration) 
    Annotating Discount 
    Skipping CartItem 
    Annotating LineItem 
    Annotating Order 
    Annotating Product 
    Annotating User 
    Skipping Cart 
    cat app/models/line_item.rb 
    # == Schema Information 
    # Schema version: 20080601000010 
    # 
    # Table name: line_items 
    # 
    #  id          :integer         not null, primary key 
    #  product_id  :integer         not null 
    #  order_id    :integer         not null 
    #  quantity    :integer         not null 
    #  total_price :decimal(8, 2)   not null 
    #  created_at  :datetime         
    #  updated_at  :datetime         
    # 
      
    #START:belongs_to 
    class LineItem < ActiveRecord::Base 
      belongs_to :order 
      belongs_to :product 
    #END:belongs_to 
      
      def self.from_cart_item(cart_item) 
        li = self.new 
        li.product     = cart_item.product 
        li.quantity    = cart_item.quantity 
        li.total_price = cart_item.price 
        li 
      end 
      
    #START:belongs_to 
    end 
    #END:belongs_to 
    cp -v /home/rubys/git/awdwr/data/migrate/021* db/migrate 
    `/home/rubys/git/awdwr/data/migrate/021_add_placed_at_to_orders.rb' -> `db/migrate/021_add_placed_at_to_orders.rb' 
    rake db:migrate 
    mv 021_add_placed_at_to_orders.rb 20080601000011_add_placed_at_to_orders.rb 
    (in /home/rubys/git/awdwr/work/migration) 
    ==  AddPlacedAtToOrders: migrating ============================================ 
    -- add_column(:orders, :placed_at, :datetime, {:default=>Mon May 18 08:35:44 -0400 2009}) 
       -> 0.0009s 
    ==  AddPlacedAtToOrders: migrated (0.0010s) =================================== 
      
    rake annotate_models 
    (in /home/rubys/git/awdwr/work/migration) 
    Annotating Discount 
    Skipping CartItem 
    Annotating LineItem 
    Annotating Order 
    Annotating Product 
    Annotating User 
    Skipping Cart 
    cat app/models/line_item.rb 
    # == Schema Information 
    # Schema version: 20080601000011 
    # 
    # Table name: line_items 
    # 
    #  id          :integer         not null, primary key 
    #  product_id  :integer         not null 
    #  order_id    :integer         not null 
    #  quantity    :integer         not null 
    #  total_price :decimal(8, 2)   not null 
    #  created_at  :datetime         
    #  updated_at  :datetime         
    # 
      
    #START:belongs_to 
    class LineItem < ActiveRecord::Base 
      belongs_to :order 
      belongs_to :product 
    #END:belongs_to 
      
      def self.from_cart_item(cart_item) 
        li = self.new 
        li.product     = cart_item.product 
        li.quantity    = cart_item.quantity 
        li.total_price = cart_item.price 
        li 
      end 
      
    #START:belongs_to 
    end 
    #END:belongs_to 
    cp -v /home/rubys/git/awdwr/data/migrate/022* db/migrate 
    `/home/rubys/git/awdwr/data/migrate/022_add_columns_to_orders.rb' -> `db/migrate/022_add_columns_to_orders.rb' 
    rake db:migrate 
    mv 022_add_columns_to_orders.rb 20080601000012_add_columns_to_orders.rb 
    (in /home/rubys/git/awdwr/work/migration) 
    ==  AddColumnsToOrders: migrating ============================================= 
    -- add_column(:orders, :attn, :string, {:limit=>100}) 
       -> 0.0012s 
    -- add_column(:orders, :order_type, :integer) 
       -> 0.0005s 
    -- add_column(:orders, :ship_class, :string, {:null=>false, :default=>"priority"}) 
       -> 0.0004s 
    -- add_column(:orders, :amount, :decimal, {:precision=>8, :scale=>2}) 
       -> 0.0004s 
    -- add_column(:orders, :state, :string, {:limit=>2}) 
       -> 0.0004s 
    ==  AddColumnsToOrders: migrated (0.0032s) ==================================== 
      
    rake annotate_models 
    (in /home/rubys/git/awdwr/work/migration) 
    Annotating Discount 
    Skipping CartItem 
    Annotating LineItem 
    Annotating Order 
    Annotating Product 
    Annotating User 
    Skipping Cart 
    cat app/models/line_item.rb 
    # == Schema Information 
    # Schema version: 20080601000012 
    # 
    # Table name: line_items 
    # 
    #  id          :integer         not null, primary key 
    #  product_id  :integer         not null 
    #  order_id    :integer         not null 
    #  quantity    :integer         not null 
    #  total_price :decimal(8, 2)   not null 
    #  created_at  :datetime         
    #  updated_at  :datetime         
    # 
      
    #START:belongs_to 
    class LineItem < ActiveRecord::Base 
      belongs_to :order 
      belongs_to :product 
    #END:belongs_to 
      
      def self.from_cart_item(cart_item) 
        li = self.new 
        li.product     = cart_item.product 
        li.quantity    = cart_item.quantity 
        li.total_price = cart_item.price 
        li 
      end 
      
    #START:belongs_to 
    end 
    #END:belongs_to 
    cp -v /home/rubys/git/awdwr/data/migrate/023* db/migrate 
    `/home/rubys/git/awdwr/data/migrate/023_rename_email_column.rb' -> `db/migrate/023_rename_email_column.rb' 
    rake db:migrate 
    mv 023_rename_email_column.rb 20080601000013_rename_email_column.rb 
    (in /home/rubys/git/awdwr/work/migration) 
    ==  RenameEmailColumn: migrating ============================================== 
    -- rename_column(:orders, :e_mail, :customer_email) 
       -> 0.0330s 
    ==  RenameEmailColumn: migrated (0.0331s) ===================================== 
      
    rake annotate_models 
    (in /home/rubys/git/awdwr/work/migration) 
    Annotating Discount 
    Skipping CartItem 
    Annotating LineItem 
    Annotating Order 
    Annotating Product 
    Annotating User 
    Skipping Cart 
    cat app/models/line_item.rb 
    # == Schema Information 
    # Schema version: 20080601000013 
    # 
    # Table name: line_items 
    # 
    #  id          :integer         not null, primary key 
    #  product_id  :integer         not null 
    #  order_id    :integer         not null 
    #  quantity    :integer         not null 
    #  total_price :decimal(8, 2)   not null 
    #  created_at  :datetime         
    #  updated_at  :datetime         
    # 
      
    #START:belongs_to 
    class LineItem < ActiveRecord::Base 
      belongs_to :order 
      belongs_to :product 
    #END:belongs_to 
      
      def self.from_cart_item(cart_item) 
        li = self.new 
        li.product     = cart_item.product 
        li.quantity    = cart_item.quantity 
        li.total_price = cart_item.price 
        li 
      end 
      
    #START:belongs_to 
    end 
    #END:belongs_to 
    cp -v /home/rubys/git/awdwr/data/migrate/024* db/migrate 
    `/home/rubys/git/awdwr/data/migrate/024_change_order_type_to_string.rb' -> `db/migrate/024_change_order_type_to_string.rb' 
    rake db:migrate 
    mv 024_change_order_type_to_string.rb 20080601000014_change_order_type_to_string.rb 
    (in /home/rubys/git/awdwr/work/migration) 
    ==  ChangeOrderTypeToString: migrating ======================================== 
    -- change_column(:orders, :order_type, :string) 
       -> 0.0326s 
    ==  ChangeOrderTypeToString: migrated (0.0327s) =============================== 
      
    rake annotate_models 
    (in /home/rubys/git/awdwr/work/migration) 
    Annotating Discount 
    Skipping CartItem 
    Annotating LineItem 
    Annotating Order 
    Annotating Product 
    Annotating User 
    Skipping Cart 
    cat app/models/line_item.rb 
    # == Schema Information 
    # Schema version: 20080601000014 
    # 
    # Table name: line_items 
    # 
    #  id          :integer         not null, primary key 
    #  product_id  :integer         not null 
    #  order_id    :integer         not null 
    #  quantity    :integer         not null 
    #  total_price :decimal(8, 2)   not null 
    #  created_at  :datetime         
    #  updated_at  :datetime         
    # 
      
    #START:belongs_to 
    class LineItem < ActiveRecord::Base 
      belongs_to :order 
      belongs_to :product 
    #END:belongs_to 
      
      def self.from_cart_item(cart_item) 
        li = self.new 
        li.product     = cart_item.product 
        li.quantity    = cart_item.quantity 
        li.total_price = cart_item.price 
        li 
      end 
      
    #START:belongs_to 
    end 
    #END:belongs_to 
    cp -v /home/rubys/git/awdwr/data/migrate/025* db/migrate 
    `/home/rubys/git/awdwr/data/migrate/025_create_order_histories.rb' -> `db/migrate/025_create_order_histories.rb' 
    rake db:migrate 
    mv 025_create_order_histories.rb 20080601000015_create_order_histories.rb 
    (in /home/rubys/git/awdwr/work/migration) 
    ==  CreateOrderHistories: migrating =========================================== 
    -- create_table(:order_histories) 
       -> 0.0018s 
    ==  CreateOrderHistories: migrated (0.0019s) ================================== 
      
    rake annotate_models 
    (in /home/rubys/git/awdwr/work/migration) 
    Annotating Discount 
    Skipping CartItem 
    Annotating LineItem 
    Annotating Order 
    Annotating Product 
    Annotating User 
    Skipping Cart 
    cat app/models/line_item.rb 
    # == Schema Information 
    # Schema version: 20080601000015 
    # 
    # Table name: line_items 
    # 
    #  id          :integer         not null, primary key 
    #  product_id  :integer         not null 
    #  order_id    :integer         not null 
    #  quantity    :integer         not null 
    #  total_price :decimal(8, 2)   not null 
    #  created_at  :datetime         
    #  updated_at  :datetime         
    # 
      
    #START:belongs_to 
    class LineItem < ActiveRecord::Base 
      belongs_to :order 
      belongs_to :product 
    #END:belongs_to 
      
      def self.from_cart_item(cart_item) 
        li = self.new 
        li.product     = cart_item.product 
        li.quantity    = cart_item.quantity 
        li.total_price = cart_item.price 
        li 
      end 
      
    #START:belongs_to 
    end 
    #END:belongs_to 
    cp -v /home/rubys/git/awdwr/data/migrate/026* db/migrate 
    `/home/rubys/git/awdwr/data/migrate/026_create_table_tickets.rb' -> `db/migrate/026_create_table_tickets.rb' 
    rake db:migrate 
    mv 026_create_table_tickets.rb 20080601000016_create_table_tickets.rb 
    rake aborted! 
    An error has occurred, this and all later migrations canceled: 
     
    SQLite3::SQLException: near "auto_increment": syntax error: CREATE TABLE "tickets" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "description" text, "text" text, "created_at" datetime, "updated_at" datetime) auto_increment = 10000 
     
    (See full trace by running task with --trace) 
    (in /home/rubys/git/awdwr/work/migration) 
    ==  CreateTableTickets: migrating ============================================= 
    -- create_table(:tickets, {:options=>"auto_increment = 10000"}) 
    rm db/migrate/20080601000016_create_table_tickets.rb 
    rake annotate_models 
    (in /home/rubys/git/awdwr/work/migration) 
    Annotating Discount 
    Skipping CartItem 
    Annotating LineItem 
    Annotating Order 
    Annotating Product 
    Annotating User 
    Skipping Cart 
    cat app/models/line_item.rb 
    # == Schema Information 
    # Schema version: 20080601000015 
    # 
    # Table name: line_items 
    # 
    #  id          :integer         not null, primary key 
    #  product_id  :integer         not null 
    #  order_id    :integer         not null 
    #  quantity    :integer         not null 
    #  total_price :decimal(8, 2)   not null 
    #  created_at  :datetime         
    #  updated_at  :datetime         
    # 
      
    #START:belongs_to 
    class LineItem < ActiveRecord::Base 
      belongs_to :order 
      belongs_to :product 
    #END:belongs_to 
      
      def self.from_cart_item(cart_item) 
        li = self.new 
        li.product     = cart_item.product 
        li.quantity    = cart_item.quantity 
        li.total_price = cart_item.price 
        li 
      end 
      
    #START:belongs_to 
    end 
    #END:belongs_to 
    cp -v /home/rubys/git/awdwr/data/migrate/027* db/migrate 
    `/home/rubys/git/awdwr/data/migrate/027_rename_order_histories.rb' -> `db/migrate/027_rename_order_histories.rb' 
    rake db:migrate 
    mv 027_rename_order_histories.rb 20080601000016_rename_order_histories.rb 
    (in /home/rubys/git/awdwr/work/migration) 
    ==  RenameOrderHistories: migrating =========================================== 
    -- rename_table(:order_histories, :order_notes) 
       -> 0.0007s 
    ==  RenameOrderHistories: migrated (0.0008s) ================================== 
      
    rake annotate_models 
    (in /home/rubys/git/awdwr/work/migration) 
    Annotating Discount 
    Skipping CartItem 
    Annotating LineItem 
    Annotating Order 
    Annotating Product 
    Annotating User 
    Skipping Cart 
    cat app/models/line_item.rb 
    # == Schema Information 
    # Schema version: 20080601000016 
    # 
    # Table name: line_items 
    # 
    #  id          :integer         not null, primary key 
    #  product_id  :integer         not null 
    #  order_id    :integer         not null 
    #  quantity    :integer         not null 
    #  total_price :decimal(8, 2)   not null 
    #  created_at  :datetime         
    #  updated_at  :datetime         
    # 
      
    #START:belongs_to 
    class LineItem < ActiveRecord::Base 
      belongs_to :order 
      belongs_to :product 
    #END:belongs_to 
      
      def self.from_cart_item(cart_item) 
        li = self.new 
        li.product     = cart_item.product 
        li.quantity    = cart_item.quantity 
        li.total_price = cart_item.price 
        li 
      end 
      
    #START:belongs_to 
    end 
    #END:belongs_to 
    cp -v /home/rubys/git/awdwr/data/migrate/028* db/migrate 
    `/home/rubys/git/awdwr/data/migrate/028_create_order_histories2.rb' -> `db/migrate/028_create_order_histories2.rb' 
    rake db:migrate 
    mv 028_create_order_histories2.rb 20080601000017_create_order_histories2.rb 
    (in /home/rubys/git/awdwr/work/migration) 
    ==  CreateOrderHistories2: migrating ========================================== 
    -- create_table(:order_histories) 
       -> 0.0014s 
    ==  CreateOrderHistories2: migrated (0.0118s) ================================= 
      
    rake annotate_models 
    (in /home/rubys/git/awdwr/work/migration) 
    Annotating Discount 
    Skipping CartItem 
    Annotating LineItem 
    Annotating Order 
    Annotating Product 
    Annotating User 
    Skipping Cart 
    cat app/models/line_item.rb 
    # == Schema Information 
    # Schema version: 20080601000017 
    # 
    # Table name: line_items 
    # 
    #  id          :integer         not null, primary key 
    #  product_id  :integer         not null 
    #  order_id    :integer         not null 
    #  quantity    :integer         not null 
    #  total_price :decimal(8, 2)   not null 
    #  created_at  :datetime         
    #  updated_at  :datetime         
    # 
      
    #START:belongs_to 
    class LineItem < ActiveRecord::Base 
      belongs_to :order 
      belongs_to :product 
    #END:belongs_to 
      
      def self.from_cart_item(cart_item) 
        li = self.new 
        li.product     = cart_item.product 
        li.quantity    = cart_item.quantity 
        li.total_price = cart_item.price 
        li 
      end 
      
    #START:belongs_to 
    end 
    #END:belongs_to 
    cp -v /home/rubys/git/awdwr/data/migrate/029* db/migrate 
    `/home/rubys/git/awdwr/data/migrate/029_add_customer_name_index_to_orders.rb' -> `db/migrate/029_add_customer_name_index_to_orders.rb' 
    rake db:migrate 
    mv 029_add_customer_name_index_to_orders.rb 20080601000018_add_customer_name_index_to_orders.rb 
    (in /home/rubys/git/awdwr/work/migration) 
    ==  AddCustomerNameIndexToOrders: migrating =================================== 
    -- add_index(:orders, :name) 
       -> 0.0006s 
    ==  AddCustomerNameIndexToOrders: migrated (0.0007s) ========================== 
      
    rake annotate_models 
    (in /home/rubys/git/awdwr/work/migration) 
    Annotating Discount 
    Skipping CartItem 
    Annotating LineItem 
    Annotating Order 
    Annotating Product 
    Annotating User 
    Skipping Cart 
    cat app/models/line_item.rb 
    # == Schema Information 
    # Schema version: 20080601000018 
    # 
    # Table name: line_items 
    # 
    #  id          :integer         not null, primary key 
    #  product_id  :integer         not null 
    #  order_id    :integer         not null 
    #  quantity    :integer         not null 
    #  total_price :decimal(8, 2)   not null 
    #  created_at  :datetime         
    #  updated_at  :datetime         
    # 
      
    #START:belongs_to 
    class LineItem < ActiveRecord::Base 
      belongs_to :order 
      belongs_to :product 
    #END:belongs_to 
      
      def self.from_cart_item(cart_item) 
        li = self.new 
        li.product     = cart_item.product 
        li.quantity    = cart_item.quantity 
        li.total_price = cart_item.price 
        li 
      end 
      
    #START:belongs_to 
    end 
    #END:belongs_to 
    cp -v /home/rubys/git/awdwr/data/migrate/030* db/migrate 
    `/home/rubys/git/awdwr/data/migrate/030_create_author_book.rb' -> `db/migrate/030_create_author_book.rb' 
    rake db:migrate 
    mv 030_create_author_book.rb 20080601000019_create_author_book.rb 
    (in /home/rubys/git/awdwr/work/migration) 
    ==  CreateAuthorBook: migrating =============================================== 
    -- create_table(:authors_books, {:id=>false}) 
       -> 0.0013s 
    ==  CreateAuthorBook: migrated (0.0015s) ====================================== 
      
    rake annotate_models 
    (in /home/rubys/git/awdwr/work/migration) 
    Annotating Discount 
    Skipping CartItem 
    Annotating LineItem 
    Annotating Order 
    Annotating Product 
    Annotating User 
    Skipping Cart 
    cat app/models/line_item.rb 
    # == Schema Information 
    # Schema version: 20080601000019 
    # 
    # Table name: line_items 
    # 
    #  id          :integer         not null, primary key 
    #  product_id  :integer         not null 
    #  order_id    :integer         not null 
    #  quantity    :integer         not null 
    #  total_price :decimal(8, 2)   not null 
    #  created_at  :datetime         
    #  updated_at  :datetime         
    # 
      
    #START:belongs_to 
    class LineItem < ActiveRecord::Base 
      belongs_to :order 
      belongs_to :product 
    #END:belongs_to 
      
      def self.from_cart_item(cart_item) 
        li = self.new 
        li.product     = cart_item.product 
        li.quantity    = cart_item.quantity 
        li.total_price = cart_item.price 
        li 
      end 
      
    #START:belongs_to 
    end 
    #END:belongs_to 
    cp -v /home/rubys/git/awdwr/data/migrate/031* db/migrate 
    `/home/rubys/git/awdwr/data/migrate/031_create_table_tickets.rb' -> `db/migrate/031_create_table_tickets.rb' 
    rake db:migrate 
    mv 031_create_table_tickets.rb 20080601000020_create_table_tickets.rb 
    (in /home/rubys/git/awdwr/work/migration) 
    ==  CreateTableTickets: migrating ============================================= 
    -- create_table(:tickets, {:primary_key=>:number}) 
       -> 0.0012s 
    ==  CreateTableTickets: migrated (0.0013s) ==================================== 
      
    rake annotate_models 
    (in /home/rubys/git/awdwr/work/migration) 
    Annotating Discount 
    Skipping CartItem 
    Annotating LineItem 
    Annotating Order 
    Annotating Product 
    Annotating User 
    Skipping Cart 
    cat app/models/line_item.rb 
    # == Schema Information 
    # Schema version: 20080601000020 
    # 
    # Table name: line_items 
    # 
    #  id          :integer         not null, primary key 
    #  product_id  :integer         not null 
    #  order_id    :integer         not null 
    #  quantity    :integer         not null 
    #  total_price :decimal(8, 2)   not null 
    #  created_at  :datetime         
    #  updated_at  :datetime         
    # 
      
    #START:belongs_to 
    class LineItem < ActiveRecord::Base 
      belongs_to :order 
      belongs_to :product 
    #END:belongs_to 
      
      def self.from_cart_item(cart_item) 
        li = self.new 
        li.product     = cart_item.product 
        li.quantity    = cart_item.quantity 
        li.total_price = cart_item.price 
        li 
      end 
      
    #START:belongs_to 
    end 
    #END:belongs_to 
    cp -v /home/rubys/git/awdwr/data/migrate/032* db/migrate 
    `/home/rubys/git/awdwr/data/migrate/032_test_discounts.rb' -> `db/migrate/032_test_discounts.rb' 
    rake db:migrate 
    mv 032_test_discounts.rb 20080601000021_test_discounts.rb 
    rake aborted! 
    An error has occurred, this and all later migrations canceled: 
     
    uninitialized constant TestDiscounts::Sku 
     
    (See full trace by running task with --trace) 
    (in /home/rubys/git/awdwr/work/migration) 
    ==  TestDiscounts: migrating ================================================== 
    ==  TestDiscounts: reverting ================================================== 
    ==  TestDiscounts: reverted (0.0031s) ========================================= 
      
    rm db/migrate/20080601000021_test_discounts.rb 
    rake annotate_models 
    (in /home/rubys/git/awdwr/work/migration) 
    Annotating Discount 
    Skipping CartItem 
    Annotating LineItem 
    Annotating Order 
    Annotating Product 
    Annotating User 
    Skipping Cart 
    cat app/models/line_item.rb 
    # == Schema Information 
    # Schema version: 20080601000020 
    # 
    # Table name: line_items 
    # 
    #  id          :integer         not null, primary key 
    #  product_id  :integer         not null 
    #  order_id    :integer         not null 
    #  quantity    :integer         not null 
    #  total_price :decimal(8, 2)   not null 
    #  created_at  :datetime         
    #  updated_at  :datetime         
    # 
      
    #START:belongs_to 
    class LineItem < ActiveRecord::Base 
      belongs_to :order 
      belongs_to :product 
    #END:belongs_to 
      
      def self.from_cart_item(cart_item) 
        li = self.new 
        li.product     = cart_item.product 
        li.quantity    = cart_item.quantity 
        li.total_price = cart_item.price 
        li 
      end 
      
    #START:belongs_to 
    end 
    #END:belongs_to 
    mkdir db/migrate/dev_data 
    cp /home/rubys/git/awdwr/data/migrate/users.yml db/migrate/dev_data 
    rake db:migrate 
    (in /home/rubys/git/awdwr/work/migration) 
    rake annotate_models 
    (in /home/rubys/git/awdwr/work/migration) 
    Annotating Discount 
    Skipping CartItem 
    Annotating LineItem 
    Annotating Order 
    Annotating Product 
    Annotating User 
    Skipping Cart 
    cat app/models/line_item.rb 
    # == Schema Information 
    # Schema version: 20080601000020 
    # 
    # Table name: line_items 
    # 
    #  id          :integer         not null, primary key 
    #  product_id  :integer         not null 
    #  order_id    :integer         not null 
    #  quantity    :integer         not null 
    #  total_price :decimal(8, 2)   not null 
    #  created_at  :datetime         
    #  updated_at  :datetime         
    # 
      
    #START:belongs_to 
    class LineItem < ActiveRecord::Base 
      belongs_to :order 
      belongs_to :product 
    #END:belongs_to 
      
      def self.from_cart_item(cart_item) 
        li = self.new 
        li.product     = cart_item.product 
        li.quantity    = cart_item.quantity 
        li.total_price = cart_item.price 
        li 
      end 
      
    #START:belongs_to 
    end 
    #END:belongs_to 
    cp -v /home/rubys/git/awdwr/data/migrate/034* db/migrate 
    `/home/rubys/git/awdwr/data/migrate/034_load_user_data.rb' -> `db/migrate/034_load_user_data.rb' 
    rake db:migrate 
    mv 034_load_user_data.rb 20080601000021_load_user_data.rb 
    (in /home/rubys/git/awdwr/work/migration) 
    ==  LoadUserData: migrating =================================================== 
    ==  LoadUserData: reverting =================================================== 
    ==  LoadUserData: reverted (0.0071s) ========================================== 
      
    ==  LoadUserData: migrated (0.0119s) ========================================== 
      
    rake annotate_models 
    (in /home/rubys/git/awdwr/work/migration) 
    Annotating Discount 
    Skipping CartItem 
    Annotating LineItem 
    Annotating Order 
    Annotating Product 
    Annotating User 
    Skipping Cart 
    cat app/models/line_item.rb 
    # == Schema Information 
    # Schema version: 20080601000021 
    # 
    # Table name: line_items 
    # 
    #  id          :integer         not null, primary key 
    #  product_id  :integer         not null 
    #  order_id    :integer         not null 
    #  quantity    :integer         not null 
    #  total_price :decimal(8, 2)   not null 
    #  created_at  :datetime         
    #  updated_at  :datetime         
    # 
      
    #START:belongs_to 
    class LineItem < ActiveRecord::Base 
      belongs_to :order 
      belongs_to :product 
    #END:belongs_to 
      
      def self.from_cart_item(cart_item) 
        li = self.new 
        li.product     = cart_item.product 
        li.quantity    = cart_item.quantity 
        li.total_price = cart_item.price 
        li 
      end 
      
    #START:belongs_to 
    end 
    #END:belongs_to 
    cp -v /home/rubys/git/awdwr/data/migrate/035* db/migrate 
    `/home/rubys/git/awdwr/data/migrate/035_change_price_to_integer.rb' -> `db/migrate/035_change_price_to_integer.rb' 
    rake db:migrate 
    mv 035_change_price_to_integer.rb 20080601000022_change_price_to_integer.rb 
    (in /home/rubys/git/awdwr/work/migration) 
    ==  ChangePriceToInteger: migrating =========================================== 
    -- change_column(:line_items, :total_price, :integer) 
       -> 0.0374s 
    ==  ChangePriceToInteger: migrated (0.0524s) ================================== 
      
    rake annotate_models 
    (in /home/rubys/git/awdwr/work/migration) 
    Annotating Discount 
    Skipping CartItem 
    Annotating LineItem 
    Annotating Order 
    Annotating Product 
    Annotating User 
    Skipping Cart 
    cat app/models/line_item.rb 
    # == Schema Information 
    # Schema version: 20080601000022 
    # 
    # Table name: line_items 
    # 
    #  id          :integer         not null, primary key 
    #  product_id  :integer         not null 
    #  order_id    :integer         not null 
    #  quantity    :integer         not null 
    #  total_price :integer         not null 
    #  created_at  :datetime         
    #  updated_at  :datetime         
    # 
      
    #START:belongs_to 
    class LineItem < ActiveRecord::Base 
      belongs_to :order 
      belongs_to :product 
    #END:belongs_to 
      
      def self.from_cart_item(cart_item) 
        li = self.new 
        li.product     = cart_item.product 
        li.quantity    = cart_item.quantity 
        li.total_price = cart_item.price 
        li 
      end 
      
    #START:belongs_to 
    end 
    #END:belongs_to 
    cp -v /home/rubys/git/awdwr/data/migrate/036* db/migrate 
    `/home/rubys/git/awdwr/data/migrate/036_total_price_to_unit.rb' -> `db/migrate/036_total_price_to_unit.rb' 
    rake db:migrate 
    mv 036_total_price_to_unit.rb 20080601000023_total_price_to_unit.rb 
    (in /home/rubys/git/awdwr/work/migration) 
    ==  TotalPriceToUnit: migrating =============================================== 
    -- add_column(:line_items, :unit_price, :decimal, {:precision=>8, :scale=>2}) 
       -> 0.0008s 
    ==  TotalPriceToUnit: migrated (0.0092s) ====================================== 
      
    rake annotate_models 
    (in /home/rubys/git/awdwr/work/migration) 
    Annotating Discount 
    Skipping CartItem 
    Annotating LineItem 
    Annotating Order 
    Annotating Product 
    Annotating User 
    Skipping Cart 
    cat app/models/line_item.rb 
    # == Schema Information 
    # Schema version: 20080601000023 
    # 
    # Table name: line_items 
    # 
    #  id          :integer         not null, primary key 
    #  product_id  :integer         not null 
    #  order_id    :integer         not null 
    #  quantity    :integer         not null 
    #  total_price :integer         not null 
    #  created_at  :datetime         
    #  updated_at  :datetime         
    #  unit_price  :decimal(8, 2)    
    # 
      
    #START:belongs_to 
    class LineItem < ActiveRecord::Base 
      belongs_to :order 
      belongs_to :product 
    #END:belongs_to 
      
      def self.from_cart_item(cart_item) 
        li = self.new 
        li.product     = cart_item.product 
        li.quantity    = cart_item.quantity 
        li.total_price = cart_item.price 
        li 
      end 
      
    #START:belongs_to 
    end 
    #END:belongs_to 
    cp -v /home/rubys/git/awdwr/data/migrate/037* db/migrate 
    `/home/rubys/git/awdwr/data/migrate/037_add_foreign_key.rb' -> `db/migrate/037_add_foreign_key.rb' 
    cp -v /home/rubys/git/awdwr/data/migrate/migration_helpers.rb lib 
    `/home/rubys/git/awdwr/data/migrate/migration_helpers.rb' -> `lib/migration_helpers.rb' 
    rake db:migrate 
    mv 037_add_foreign_key.rb 20080601000024_add_foreign_key.rb 
    (in /home/rubys/git/awdwr/work/migration) 
    ==  AddForeignKey: migrating ================================================== 
    -- execute("\n      CREATE TRIGGER fk_line_items_products_insert\n      BEFORE INSERT ON line_items\n      FOR EACH ROW BEGIN\n        SELECT \n\t  RAISE(ABORT, \"constraint violation: fk_line_items_products\")\n\tWHERE \n\t  (SELECT id FROM products WHERE id = NEW.product_id) IS NULL;\n      END;\n    ") 
       -> 0.0007s 
    -- execute("\n      CREATE TRIGGER fk_line_items_products_update\n      BEFORE UPDATE ON line_items\n      FOR EACH ROW BEGIN\n        SELECT \n\t  RAISE(ABORT, \"constraint violation: fk_line_items_products\")\n\tWHERE \n\t  (SELECT id FROM products WHERE id = NEW.product_id) IS NULL;\n      END;\n    ") 
       -> 0.0003s 
    -- execute("\n      CREATE TRIGGER fk_line_items_products_delete\n      BEFORE DELETE ON products\n      FOR EACH ROW BEGIN\n        SELECT \n\t  RAISE(ABORT, \"constraint violation: fk_line_items_products\")\n\tWHERE \n\t  (SELECT id FROM line_items WHERE product_id = OLD.id) IS NOT NULL;\n      END;\n    ") 
       -> 0.0003s 
    -- execute("\n      CREATE TRIGGER fk_line_items_orders_insert\n      BEFORE INSERT ON line_items\n      FOR EACH ROW BEGIN\n        SELECT \n\t  RAISE(ABORT, \"constraint violation: fk_line_items_orders\")\n\tWHERE \n\t  (SELECT id FROM orders WHERE id = NEW.order_id) IS NULL;\n      END;\n    ") 
       -> 0.0003s 
    -- execute("\n      CREATE TRIGGER fk_line_items_orders_update\n      BEFORE UPDATE ON line_items\n      FOR EACH ROW BEGIN\n        SELECT \n\t  RAISE(ABORT, \"constraint violation: fk_line_items_orders\")\n\tWHERE \n\t  (SELECT id FROM orders WHERE id = NEW.order_id) IS NULL;\n      END;\n    ") 
       -> 0.0003s 
    -- execute("\n      CREATE TRIGGER fk_line_items_orders_delete\n      BEFORE DELETE ON orders\n      FOR EACH ROW BEGIN\n        SELECT \n\t  RAISE(ABORT, \"constraint violation: fk_line_items_orders\")\n\tWHERE \n\t  (SELECT id FROM line_items WHERE order_id = OLD.id) IS NOT NULL;\n      END;\n    ") 
       -> 0.0003s 
    ==  AddForeignKey: migrated (0.0025s) ========================================= 
      
    rake annotate_models 
    (in /home/rubys/git/awdwr/work/migration) 
    Annotating Discount 
    Skipping CartItem 
    Annotating LineItem 
    Annotating Order 
    Annotating Product 
    Annotating User 
    Skipping Cart 
    cat app/models/line_item.rb 
    # == Schema Information 
    # Schema version: 20080601000024 
    # 
    # Table name: line_items 
    # 
    #  id          :integer         not null, primary key 
    #  product_id  :integer         not null 
    #  order_id    :integer         not null 
    #  quantity    :integer         not null 
    #  total_price :integer         not null 
    #  created_at  :datetime         
    #  updated_at  :datetime         
    #  unit_price  :decimal(8, 2)    
    # 
      
    #START:belongs_to 
    class LineItem < ActiveRecord::Base 
      belongs_to :order 
      belongs_to :product 
    #END:belongs_to 
      
      def self.from_cart_item(cart_item) 
        li = self.new 
        li.product     = cart_item.product 
        li.quantity    = cart_item.quantity 
        li.total_price = cart_item.price 
        li 
      end 
      
    #START:belongs_to 
    end 
    #END:belongs_to 
    
      18 Active Record: The Basics 
     
    echo "Order.column_names" | ruby script/console 
    >> Order.column_names 
    => ["id", "name", "address", "email", "pay_type", "created_at", "updated_at", "customer_email", "placed_at", "attn", "order_type", "ship_class", "amount", "state"] 
    >>  
    echo "Order.columns_hash[\"pay_type\"]" | ruby script/console 
    >> Order.columns_hash["pay_type"] 
    => #<ActiveRecord::ConnectionAdapters::SQLiteColumn:0xb76cba44 @sql_type="varchar(10)", @default=nil, @precision=nil, @primary=false, @type=:string, @limit=10, @null=true, @name="pay_type", @scale=nil> 
    >>  
    sqlite3> select * from orders limit 1 
                id = 1 
              name = Dave Thomas 
           address = 123 Main St 
             email = customer@pragprog.com 
          pay_type = check 
        created_at = 2009-05-18 12:33:36.757790 
        updated_at = 2009-05-18 12:33:36.757790 
    customer_email =  
         placed_at = 2009-05-18 08:35:44.568405 
              attn =  
        order_type =  
        ship_class = priority 
            amount =  
             state =  
    echo "Product.find(:first).price_before_type_cast" | ruby script/console 
    >> Product.find(:first).price_before_type_cast 
    => "29.95" 
    >>  
    echo "Product.find(:first).updated_at_before_type_cast" | ruby script/console 
    >> Product.find(:first).updated_at_before_type_cast 
    => "2009-05-18 12:32:47.685914" 
    >>  
    irb e1/ar/new_examples.rb 
    >> $: << File.dirname(__FILE__) 
    => ["/usr/local/lib/site_ruby/1.8", "/usr/local/lib/site_ruby/1.8/i486-linux", "/usr/local/lib/site_ruby/1.8/i386-linux", "/usr/local/lib/site_ruby", "/usr/lib/ruby/vendor_ruby/1.8", "/usr/lib/ruby/vendor_ruby/1.8/i486-linux", "/usr/lib/ruby/vendor_ruby", "/usr/lib/ruby/1.8", "/usr/lib/ruby/1.8/i486-linux", "/usr/lib/ruby/1.8/i386-linux", ".", "/home/rubys/git/awdwr/data/code/e1/ar"] 
    >> require "connect" 
    => true 
      
    ?> require "rubygems" 
    => [] 
    >> require "activerecord" 
    => [] 
      
    >> class Order < ActiveRecord::Base 
    >> end 
    => nil 
      
    ?> an_order = Order.new 
    => #<Order id: nil, name: nil, address: nil, email: nil, pay_type: nil, created_at: nil, updated_at: nil, customer_email: nil, placed_at: "2009-05-18 08:35:44", attn: nil, order_type: nil, ship_class: "priority", amount: nil, state: nil> 
    >> an_order.name     = "Dave Thomas" 
    => "Dave Thomas" 
    >> an_order.email    = "dave@pragprog.com" 
    => "dave@pragprog.com" 
    >> an_order.address  = "123 Main St" 
    => "123 Main St" 
    >> an_order.pay_type = "check" 
    => "check" 
    >> an_order.save 
    => true 
      
    ?> Order.new do |o| 
    ?>   o.name     = "Dave Thomas" 
    >>   # . . . 
    ?>   o.save 
    >> end 
    => #<Order id: 4, name: "Dave Thomas", address: nil, email: nil, pay_type: nil, created_at: "2009-05-18 08:36:34", updated_at: "2009-05-18 08:36:34", customer_email: nil, placed_at: "2009-05-18 08:35:44", attn: nil, order_type: nil, ship_class: "priority", amount: nil, state: nil> 
      
    ?> an_order = Order.new( 
    ?>   :name     => "Dave Thomas", 
    ?>   :email    => "dave@pragprog.com", 
    ?>   :address  => "123 Main St", 
    ?>   :pay_type => "check") 
    => #<Order id: nil, name: "Dave Thomas", address: "123 Main St", email: "dave@pragprog.com", pay_type: "check", created_at: nil, updated_at: nil, customer_email: nil, placed_at: "2009-05-18 08:35:44", attn: nil, order_type: nil, ship_class: "priority", amount: nil, state: nil> 
    >> an_order.save 
    => true 
      
    ?> an_order = Order.new 
    => #<Order id: nil, name: nil, address: nil, email: nil, pay_type: nil, created_at: nil, updated_at: nil, customer_email: nil, placed_at: "2009-05-18 08:35:44", attn: nil, order_type: nil, ship_class: "priority", amount: nil, state: nil> 
    >> an_order.name = "Dave Thomas" 
    => "Dave Thomas" 
    >> # ... 
    ?> an_order.save 
    => true 
    >> puts "The ID of this order is #{an_order.id}" 
    The ID of this order is 6 
    => nil 
      
    ?> an_order = Order.create( 
    ?>   :name     => "Dave Thomas", 
    ?>   :email    => "dave@pragprog.com", 
    ?>   :address  => "123 Main St", 
    ?>   :pay_type => "check") 
    => #<Order id: 7, name: "Dave Thomas", address: "123 Main St", email: "dave@pragprog.com", pay_type: "check", created_at: "2009-05-18 08:36:34", updated_at: "2009-05-18 08:36:34", customer_email: nil, placed_at: "2009-05-18 08:35:44", attn: nil, order_type: nil, ship_class: "priority", amount: nil, state: nil> 
      
    ?> orders = Order.create( 
    ?>   [ { :name     => "Dave Thomas", 
    ?>       :email    => "dave@pragprog.com", 
    ?>       :address  => "123 Main St", 
    ?>       :pay_type => "check" 
    >>     }, 
    ?>     { :name     => "Andy Hunt", 
    ?>       :email    => "andy@pragprog.com", 
    ?>       :address  => "456 Gentle Drive", 
    ?>       :pay_type => "po" 
    >>     } ] ) 
    => [#<Order id: 8, name: "Dave Thomas", address: "123 Main St", email: "dave@pragprog.com", pay_type: "check", created_at: "2009-05-18 08:36:34", updated_at: "2009-05-18 08:36:34", customer_email: nil, placed_at: "2009-05-18 08:35:44", attn: nil, order_type: nil, ship_class: "priority", amount: nil, state: nil>, #<Order id: 9, name: "Andy Hunt", address: "456 Gentle Drive", email: "andy@pragprog.com", pay_type: "po", created_at: "2009-05-18 08:36:34", updated_at: "2009-05-18 08:36:34", customer_email: nil, placed_at: "2009-05-18 08:35:44", attn: nil, order_type: nil, ship_class: "priority", amount: nil, state: nil>] 
    >> >> => nil 
    irb e1/ar/find_examples.rb 
    >> $: << File.dirname(__FILE__) 
    => ["/usr/local/lib/site_ruby/1.8", "/usr/local/lib/site_ruby/1.8/i486-linux", "/usr/local/lib/site_ruby/1.8/i386-linux", "/usr/local/lib/site_ruby", "/usr/lib/ruby/vendor_ruby/1.8", "/usr/lib/ruby/vendor_ruby/1.8/i486-linux", "/usr/lib/ruby/vendor_ruby", "/usr/lib/ruby/1.8", "/usr/lib/ruby/1.8/i486-linux", "/usr/lib/ruby/1.8/i386-linux", ".", "/home/rubys/git/awdwr/data/code/e1/ar"] 
    >> require "connect" 
    => true 
    >> require "logger" 
    => [] 
      
    >> ActiveRecord::Base.logger = Logger.new(STDOUT) 
    => #<Logger:0xb796479c @level=0, @progname=nil, @formatter=nil, @default_formatter=#<Logger::Formatter:0xb7964774 @datetime_format=nil>, @logdev=#<Logger::LogDevice:0xb796474c @dev=#<IO:0xb7d1b570>, @mutex=#<Logger::LogDevice::LogDeviceMutex:0xb7964724 @mon_entering_queue=[], @mon_count=0, @mon_owner=nil, @mon_waiting_queue=[]>, @shift_size=nil, @filename=nil, @shift_age=nil>> 
      
    ?> require "rubygems" 
    => [] 
    >> require "activerecord" 
    => [] 
    >> require "pp" 
    => ["PP"] 
      
    >> @params = {} 
    => {} 
    >> def params 
    >>   @params 
    >> end 
    => nil 
      
    ?> class Order < ActiveRecord::Base 
    >>   named_scope :check, :conditions => {:pay_type => 'check'} 
    >>   named_scope :cc,    :conditions => {:pay_type => 'cc'} 
    >>   named_scope :po,    :conditions => {:pay_type => 'po'} 
    >> end 
    => #<Proc:0xb782668c@/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.2/lib/active_record/named_scope.rb:101> 
      
    ?> class Order < ActiveRecord::Base 
    >>   named_scope :recent, :conditions => ['created_at > ?', 1.week.ago] 
    >>   named_scope :since, lambda { |range|  
    ?>     { :conditions => ['created_at > ?', range] } 
    >>   } 
    >> end 
    => #<Proc:0xb782668c@/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.2/lib/active_record/named_scope.rb:101> 
      
    >> class LineItem < ActiveRecord::Base 
    >> end 
    => nil 
      
    >> class Product < ActiveRecord::Base 
    >> end 
    => nil 
      
    ?> # return an arbitrary order 
    ?> order = Order.find(:first) 
      Order Load (1.3ms)   SELECT * FROM "orders" LIMIT 1 
    => #<Order id: 1, name: "Dave Thomas", address: "123 Main St", email: "customer@pragprog.com", pay_type: "check", created_at: "2009-05-18 12:33:36", updated_at: "2009-05-18 12:33:36", customer_email: nil, placed_at: "2009-05-18 08:35:44", attn: nil, order_type: nil, ship_class: "priority", amount: nil, state: nil> 
      
    >> # return an order for Dave 
    ?> order = Order.find(:first, :conditions => "name = 'Dave Thomas'") 
      Order Load (0.8ms)   SELECT * FROM "orders" WHERE (name = 'Dave Thomas') LIMIT 1 
    => #<Order id: 1, name: "Dave Thomas", address: "123 Main St", email: "customer@pragprog.com", pay_type: "check", created_at: "2009-05-18 12:33:36", updated_at: "2009-05-18 12:33:36", customer_email: nil, placed_at: "2009-05-18 08:35:44", attn: nil, order_type: nil, ship_class: "priority", amount: nil, state: nil> 
      
    >> # return the latest order for Dave 
    ?> order = Order.find(:first, 
    ?>                    :conditions => "name = 'Dave Thomas'",  
    ?>                    :order      => "id DESC") 
      Order Load (0.5ms)   SELECT * FROM "orders" WHERE (name = 'Dave Thomas') ORDER BY id DESC LIMIT 1 
    => #<Order id: 8, name: "Dave Thomas", address: "123 Main St", email: "dave@pragprog.com", pay_type: "check", created_at: "2009-05-18 08:36:34", updated_at: "2009-05-18 08:36:34", customer_email: nil, placed_at: "2009-05-18 08:35:44", attn: nil, order_type: nil, ship_class: "priority", amount: nil, state: nil> 
      
    ?> orders = LineItem.find_by_sql("select line_items.* from line_items, orders " + 
    ?>                               " where order_id = orders.id                 " + 
    ?>                               "   and orders.name = 'Dave Thomas'          ") 
      LineItem Load (0.4ms)   select line_items.* from line_items, orders where order_id = orders.id and orders.name = 'Dave Thomas'  
    => [#<LineItem id: 1, product_id: 3, order_id: 1, quantity: 1, total_price: 2850, created_at: "2009-05-18 12:33:36", updated_at: "2009-05-18 12:33:36", unit_price: #<BigDecimal:b7b02450,'0.285E2',8(8)>>] 
      
      
    ?> orders = Order.find_by_sql("select name, pay_type from orders") 
      Order Load (0.6ms)   select name, pay_type from orders 
    => [#<Order name: "Dave Thomas", pay_type: "check">, #<Order name: "Joe User", pay_type: "check">, #<Order name: "Dave Thomas", pay_type: "check">, #<Order name: "Dave Thomas", pay_type: nil>, #<Order name: "Dave Thomas", pay_type: "check">, #<Order name: "Dave Thomas", pay_type: nil>, #<Order name: "Dave Thomas", pay_type: "check">, #<Order name: "Dave Thomas", pay_type: "check">, #<Order name: "Andy Hunt", pay_type: "po">] 
      
    >> first = orders[0] 
    => #<Order name: "Dave Thomas", pay_type: "check"> 
    >> p first.attributes 
    {"name"=>"Dave Thomas", "pay_type"=>"check"} 
    => nil 
    >> p first.attribute_names 
    ["name", "pay_type"] 
    => nil 
    >> p first.attribute_present?("address") 
    false 
    => nil 
      
      
    ?> p Order.all 
      Order Load (1.6ms)   SELECT * FROM "orders"  
    [#<Order id: 1, name: "Dave Thomas", address: "123 Main St", email: "customer@pragprog.com", pay_type: "check", created_at: "2009-05-18 12:33:36", updated_at: "2009-05-18 12:33:36", customer_email: nil, placed_at: "2009-05-18 08:35:44", attn: nil, order_type: nil, ship_class: "priority", amount: nil, state: nil>, #<Order id: 2, name: "Joe User", address: "123 Main St., Anytown USA", email: "juser@hotmail.com", pay_type: "check", created_at: "2009-05-18 12:34:46", updated_at: "2009-05-18 12:34:46", customer_email: nil, placed_at: "2009-05-18 08:35:44", attn: nil, order_type: nil, ship_class: "priority", amount: nil, state: nil>, #<Order id: 3, name: "Dave Thomas", address: "123 Main St", email: "dave@pragprog.com", pay_type: "check", created_at: "2009-05-18 08:36:34", updated_at: "2009-05-18 08:36:34", customer_email: nil, placed_at: "2009-05-18 08:35:44", attn: nil, order_type: nil, ship_class: "priority", amount: nil, state: nil>, #<Order id: 4, name: "Dave Thomas", address: nil, email: nil, pay_type: nil, created_at: "2009-05-18 08:36:34", updated_at: "2009-05-18 08:36:34", customer_email: nil, placed_at: "2009-05-18 08:35:44", attn: nil, order_type: nil, ship_class: "priority", amount: nil, state: nil>, #<Order id: 5, name: "Dave Thomas", address: "123 Main St", email: "dave@pragprog.com", pay_type: "check", created_at: "2009-05-18 08:36:34", updated_at: "2009-05-18 08:36:34", customer_email: nil, placed_at: "2009-05-18 08:35:44", attn: nil, order_type: nil, ship_class: "priority", amount: nil, state: nil>, #<Order id: 6, name: "Dave Thomas", address: nil, email: nil, pay_type: nil, created_at: "2009-05-18 08:36:34", updated_at: "2009-05-18 08:36:34", customer_email: nil, placed_at: "2009-05-18 08:35:44", attn: nil, order_type: nil, ship_class: "priority", amount: nil, state: nil>, #<Order id: 7, name: "Dave Thomas", address: "123 Main St", email: "dave@pragprog.com", pay_type: "check", created_at: "2009-05-18 08:36:34", updated_at: "2009-05-18 08:36:34", customer_email: nil, placed_at: "2009-05-18 08:35:44", attn: nil, order_type: nil, ship_class: "priority", amount: nil, state: nil>, #<Order id: 8, name: "Dave Thomas", address: "123 Main St", email: "dave@pragprog.com", pay_type: "check", created_at: "2009-05-18 08:36:34", updated_at: "2009-05-18 08:36:34", customer_email: nil, placed_at: "2009-05-18 08:35:44", attn: nil, order_type: nil, ship_class: "priority", amount: nil, state: nil>, #<Order id: 9, name: "Andy Hunt", address: "456 Gentle Drive", email: "andy@pragprog.com", pay_type: "po", created_at: "2009-05-18 08:36:34", updated_at: "2009-05-18 08:36:34", customer_email: nil, placed_at: "2009-05-18 08:35:44", attn: nil, order_type: nil, ship_class: "priority", amount: nil, state: nil>] 
    => nil 
    >> p Order.check(:order => "created_on desc").first 
      Order Load (0.5ms)   SELECT * FROM "orders" WHERE ("orders"."pay_type" = 'check') LIMIT 1 
    #<Order id: 1, name: "Dave Thomas", address: "123 Main St", email: "customer@pragprog.com", pay_type: "check", created_at: "2009-05-18 12:33:36", updated_at: "2009-05-18 12:33:36", customer_email: nil, placed_at: "2009-05-18 08:35:44", attn: nil, order_type: nil, ship_class: "priority", amount: nil, state: nil> 
    => nil 
    >> p Order.po.recent.count 
      SQL (0.3ms)   SELECT count(*) AS count_all FROM "orders" WHERE ((created_at > '2009-05-11 08:36:34') AND ("orders"."pay_type" = 'po'))  
    1 
    => nil 
    >> p Order.check.find_by_name('Dave Thomas') 
      Order Load (0.5ms)   SELECT * FROM "orders" WHERE ("orders"."name" = 'Dave Thomas') AND ("orders"."pay_type" = 'check') LIMIT 1 
    #<Order id: 1, name: "Dave Thomas", address: "123 Main St", email: "customer@pragprog.com", pay_type: "check", created_at: "2009-05-18 12:33:36", updated_at: "2009-05-18 12:33:36", customer_email: nil, placed_at: "2009-05-18 08:35:44", attn: nil, order_type: nil, ship_class: "priority", amount: nil, state: nil> 
    => nil 
      
    ?> p Order.po.recent(:order => :created_at) 
      Order Load (0.5ms)   SELECT * FROM "orders" WHERE ((created_at > '2009-05-11 08:36:34') AND ("orders"."pay_type" = 'po'))  
    [#<Order id: 9, name: "Andy Hunt", address: "456 Gentle Drive", email: "andy@pragprog.com", pay_type: "po", created_at: "2009-05-18 08:36:34", updated_at: "2009-05-18 08:36:34", customer_email: nil, placed_at: "2009-05-18 08:35:44", attn: nil, order_type: nil, ship_class: "priority", amount: nil, state: nil>] 
    => nil 
    >> p Order.po.since(1.week.ago) 
      Order Load (0.5ms)   SELECT * FROM "orders" WHERE ((created_at > '2009-05-11 08:36:34') AND ("orders"."pay_type" = 'po'))  
    [#<Order id: 9, name: "Andy Hunt", address: "456 Gentle Drive", email: "andy@pragprog.com", pay_type: "po", created_at: "2009-05-18 08:36:34", updated_at: "2009-05-18 08:36:34", customer_email: nil, placed_at: "2009-05-18 08:35:44", attn: nil, order_type: nil, ship_class: "priority", amount: nil, state: nil>] 
    => nil 
      
    >> LineItem.delete_all 
      LineItem Delete all (14.3ms)   DELETE FROM "line_items" WHERE 1=1 
    => 2 
    >> Product.delete_all 
      Product Delete all (5.7ms)   DELETE FROM "products" WHERE 1=1 
    => 3 
    >> p = Product.create(:title => "Programming Ruby", :price => 49.95) 
      Product Create (0.2ms)   INSERT INTO "products" ("price", "created_at", "title", "image_url", "updated_at", "description") VALUES(49.95, '2009-05-18 08:36:34', 'Programming Ruby', NULL, '2009-05-18 08:36:34', NULL) 
    => #<Product id: 5, title: "Programming Ruby", description: nil, image_url: nil, created_at: "2009-05-18 08:36:34", updated_at: "2009-05-18 08:36:34", price: #<BigDecimal:b7911eac,'0.4995E2',8(8)>> 
    >> LineItem.create(:quantity => 2, :unit_price => 49.95, :total_price => 99.90, 
    ?>   :product_id => p.id, :order_id => first) 
      LineItem Create (0.4ms)   INSERT INTO "line_items" ("created_at", "product_id", "quantity", "order_id", "total_price", "updated_at", "unit_price") VALUES('2009-05-18 08:36:34', 5, 2, 1, 99, '2009-05-18 08:36:34', 49.95) 
    => #<LineItem id: 3, product_id: 5, order_id: 1, quantity: 2, total_price: 99, created_at: "2009-05-18 08:36:34", updated_at: "2009-05-18 08:36:34", unit_price: #<BigDecimal:b78fa180,'0.4995E2',8(8)>> 
      
    ?> items = LineItem.find_by_sql("select *,                                  " + 
    ?>                              "       quantity*unit_price as total_price, " + 
    ?>                              "       products.title as title             " + 
    ?>                              "  from line_items, products                " + 
    ?>                              " where line_items.product_id = products.id ") 
      LineItem Load (0.6ms)   select *, quantity*unit_price as total_price, products.title as title from line_items, products where line_items.product_id = products.id  
    => [#<LineItem id: 5, product_id: 5, order_id: 1, quantity: 2, total_price: 99, created_at: "2009-05-18 08:36:34", updated_at: "2009-05-18 08:36:34", unit_price: #<BigDecimal:b78d3684,'0.4995E2',8(8)>>] 
    >> li = items[0] 
    => #<LineItem id: 5, product_id: 5, order_id: 1, quantity: 2, total_price: 99, created_at: "2009-05-18 08:36:34", updated_at: "2009-05-18 08:36:34", unit_price: #<BigDecimal:b78cec10,'0.4995E2',8(8)>> 
    >> puts "#{li.title}: #{li.quantity}x#{li.unit_price} => #{li.total_price}" 
    Programming Ruby: 2x49.95 => 99 
    => nil 
      
    ?> c1 = Order.count 
      SQL (0.2ms)   SELECT count(*) AS count_all FROM "orders"  
    => 9 
    >> c2 = Order.count(:conditions => ["name = ?", "Dave Thomas"]) 
      SQL (0.3ms)   SELECT count(*) AS count_all FROM "orders" WHERE (name = 'Dave Thomas')  
    => 7 
    >> c3 = LineItem.count_by_sql("select count(*)                        " + 
    ?>                            "  from line_items, orders              " + 
    ?>                            " where line_items.order_id = orders.id " + 
    ?>                            "   and orders.name = 'Dave Thomas'     ") 
      LineItem Count (0.3ms)   select count(*) from line_items, orders where line_items.order_id = orders.id and orders.name = 'Dave Thomas'  
    => 1 
    >> puts "Dave has #{c3} line items in #{c2} orders (#{c1} orders in all)" 
    Dave has 1 line items in 7 orders (9 orders in all) 
    => nil 
      
    ?> order  = Order.find_by_name("Dave Thomas") 
      Order Load (0.5ms)   SELECT * FROM "orders" WHERE ("orders"."name" = 'Dave Thomas') LIMIT 1 
    => #<Order id: 1, name: "Dave Thomas", address: "123 Main St", email: "customer@pragprog.com", pay_type: "check", created_at: "2009-05-18 12:33:36", updated_at: "2009-05-18 12:33:36", customer_email: nil, placed_at: "2009-05-18 08:35:44", attn: nil, order_type: nil, ship_class: "priority", amount: nil, state: nil> 
    >> orders = Order.find_all_by_name("Dave Thomas") 
      Order Load (1.6ms)   SELECT * FROM "orders" WHERE ("orders"."name" = 'Dave Thomas')  
    => [#<Order id: 1, name: "Dave Thomas", address: "123 Main St", email: "customer@pragprog.com", pay_type: "check", created_at: "2009-05-18 12:33:36", updated_at: "2009-05-18 12:33:36", customer_email: nil, placed_at: "2009-05-18 08:35:44", attn: nil, order_type: nil, ship_class: "priority", amount: nil, state: nil>, #<Order id: 3, name: "Dave Thomas", address: "123 Main St", email: "dave@pragprog.com", pay_type: "check", created_at: "2009-05-18 08:36:34", updated_at: "2009-05-18 08:36:34", customer_email: nil, placed_at: "2009-05-18 08:35:44", attn: nil, order_type: nil, ship_class: "priority", amount: nil, state: nil>, #<Order id: 4, name: "Dave Thomas", address: nil, email: nil, pay_type: nil, created_at: "2009-05-18 08:36:34", updated_at: "2009-05-18 08:36:34", customer_email: nil, placed_at: "2009-05-18 08:35:44", attn: nil, order_type: nil, ship_class: "priority", amount: nil, state: nil>, #<Order id: 5, name: "Dave Thomas", address: "123 Main St", email: "dave@pragprog.com", pay_type: "check", created_at: "2009-05-18 08:36:34", updated_at: "2009-05-18 08:36:34", customer_email: nil, placed_at: "2009-05-18 08:35:44", attn: nil, order_type: nil, ship_class: "priority", amount: nil, state: nil>, #<Order id: 6, name: "Dave Thomas", address: nil, email: nil, pay_type: nil, created_at: "2009-05-18 08:36:34", updated_at: "2009-05-18 08:36:34", customer_email: nil, placed_at: "2009-05-18 08:35:44", attn: nil, order_type: nil, ship_class: "priority", amount: nil, state: nil>, #<Order id: 7, name: "Dave Thomas", address: "123 Main St", email: "dave@pragprog.com", pay_type: "check", created_at: "2009-05-18 08:36:34", updated_at: "2009-05-18 08:36:34", customer_email: nil, placed_at: "2009-05-18 08:35:44", attn: nil, order_type: nil, ship_class: "priority", amount: nil, state: nil>, #<Order id: 8, name: "Dave Thomas", address: "123 Main St", email: "dave@pragprog.com", pay_type: "check", created_at: "2009-05-18 08:36:34", updated_at: "2009-05-18 08:36:34", customer_email: nil, placed_at: "2009-05-18 08:35:44", attn: nil, order_type: nil, ship_class: "priority", amount: nil, state: nil>] 
    >> orders = Order.find_all_by_email(params['email']) 
      Order Load (0.6ms)   SELECT * FROM "orders" WHERE ("orders"."email" IS NULL)  
    => [#<Order id: 4, name: "Dave Thomas", address: nil, email: nil, pay_type: nil, created_at: "2009-05-18 08:36:34", updated_at: "2009-05-18 08:36:34", customer_email: nil, placed_at: "2009-05-18 08:35:44", attn: nil, order_type: nil, ship_class: "priority", amount: nil, state: nil>, #<Order id: 6, name: "Dave Thomas", address: nil, email: nil, pay_type: nil, created_at: "2009-05-18 08:36:34", updated_at: "2009-05-18 08:36:34", customer_email: nil, placed_at: "2009-05-18 08:35:44", attn: nil, order_type: nil, ship_class: "priority", amount: nil, state: nil>] 
      
    >> o = LineItem.find(:all, 
    ?>                   :conditions => "pr.title = 'Programming Ruby'", 
    ?>                   :joins => "inner join products as pr on line_items.product_id = pr.id") 
      LineItem Load (0.6ms)   SELECT "line_items".* FROM "line_items" inner join products as pr on line_items.product_id = pr.id WHERE (pr.title = 'Programming Ruby')  
    => [#<LineItem id: 3, product_id: 5, order_id: 1, quantity: 2, total_price: 99, created_at: "2009-05-18 08:36:34", updated_at: "2009-05-18 08:36:34", unit_price: #<BigDecimal:b78207c8,'0.4995E2',8(8)>>] 
    >> p o.size 
    1 
    => nil 
      
    >> LineItem.delete_all 
      LineItem Delete all (4.1ms)   DELETE FROM "line_items" WHERE 1=1 
    => 1 
      
    >> res = Order.update_all("pay_type = 'wibble'") 
      Order Update (4.4ms)   UPDATE "orders" SET pay_type = 'wibble'  
    => 9 
    >> p res 
    9 
    => nil 
      
    >> res = Order.delete_all(["pay_type = ?", "wibble"]) 
      Order Delete all (9.9ms)   DELETE FROM "orders" WHERE (pay_type = 'wibble')  
    => 9 
    >> p res 
    9 
    => nil 
      
    irb e1/ar/dump_serialize_table.rb 
    >> $: << File.dirname(__FILE__) 
    => ["/usr/local/lib/site_ruby/1.8", "/usr/local/lib/site_ruby/1.8/i486-linux", "/usr/local/lib/site_ruby/1.8/i386-linux", "/usr/local/lib/site_ruby", "/usr/lib/ruby/vendor_ruby/1.8", "/usr/lib/ruby/vendor_ruby/1.8/i486-linux", "/usr/lib/ruby/vendor_ruby", "/usr/lib/ruby/1.8", "/usr/lib/ruby/1.8/i486-linux", "/usr/lib/ruby/1.8/i386-linux", ".", "/home/rubys/git/awdwr/data/code/e1/ar"] 
    >> require 'connect' 
    => true 
      
    >> require 'rubygems' 
    => [] 
    >> require 'activerecord' 
    => [] 
    >> require 'pp' 
    => ["PP"] 
      
    >> ActiveRecord::Schema.define do 
    ?>   create_table :purchases, :force => true do |t| 
    ?>     t.string :name 
    >>     t.text   :last_five 
    >>   end 
    >> end 
    -- create_table(:purchases, {:force=>true}) 
       -> 0.0411s 
    => nil 
      
    ?> class Purchase < ActiveRecord::Base 
    >>   serialize :last_five 
    >>   # ... 
    ?> end 
    => Object 
      
    ?> purchase = Purchase.new 
    => #<Purchase id: nil, name: nil, last_five: nil> 
    >> purchase.name = "Dave Thomas" 
    => "Dave Thomas" 
    >> purchase.last_five = [ 'shoes', 'shirt', 'socks', 'ski mask', 'shorts' ] 
    => ["shoes", "shirt", "socks", "ski mask", "shorts"] 
    >> purchase.save 
    => true 
      
    ?> purchase = Purchase.find_by_name("Dave Thomas") 
    => #<Purchase id: 1, name: "Dave Thomas", last_five: ["shoes", "shirt", "socks", "ski mask", "shorts"]> 
    >> pp purchase.last_five 
    ["shoes", "shirt", "socks", "ski mask", "shorts"] 
    => nil 
    >> pp purchase.last_five[3] 
    "ski mask" 
    => nil 
    >> >> => nil 
    irb e1/ar/aggregation.rb 
    >> $: << File.dirname(__FILE__) 
    => ["/usr/local/lib/site_ruby/1.8", "/usr/local/lib/site_ruby/1.8/i486-linux", "/usr/local/lib/site_ruby/1.8/i386-linux", "/usr/local/lib/site_ruby", "/usr/lib/ruby/vendor_ruby/1.8", "/usr/lib/ruby/vendor_ruby/1.8/i486-linux", "/usr/lib/ruby/vendor_ruby", "/usr/lib/ruby/1.8", "/usr/lib/ruby/1.8/i486-linux", "/usr/lib/ruby/1.8/i386-linux", ".", "/home/rubys/git/awdwr/data/code/e1/ar"] 
    >> require "connect" 
    => true 
    >> require "logger" 
    => [] 
    >> require "pp" 
    => ["PP"] 
      
    >> #ActiveRecord::Base.logger = Logger.new(STDOUT) 
      
    ?> #require "rubygems" 
    ?> #require_gem "activerecord" 
      
    ?> ActiveRecord::Schema.define do 
    ?>   create_table :customers, :force => true do |t| 
    ?>     t.datetime :created_at 
    >>     t.decimal  :credit_limit, :precision => 10, :scale => 2, :default => 100 
    >>     t.string   :first_name 
    >>     t.string   :initials 
    >>     t.string   :last_name 
    >>     t.datetime :last_purchase 
    >>     t.integer  :purchase_count, :default => 0 
    >>   end 
    >> end 
    -- create_table(:customers, {:force=>true}) 
       -> 0.0478s 
    => nil 
      
    ?> class LastFive 
      
    >>   attr_reader :list 
      
    >>   # Takes a string containing "a,b,c" and  
    ?>   # stores [ 'a', 'b', 'c' ] 
    ?>   def initialize(list_as_string) 
    >>     @list = list_as_string.split(/,/) 
    >>   end 
      
      
    >>   # Returns our contents as a  
    ?>   # comma delimited string 
    ?>   def last_five 
    >>     @list.join(',') 
    >>   end 
    >> end 
    => nil 
      
    ?> class Purchase < ActiveRecord::Base 
    >>   composed_of :last_five 
    >> end 
    => #<ActiveRecord::Reflection::AggregateReflection:0xb7b9f660 @options={}, @active_record=Purchase(id: integer, name: string, last_five: text), @name=:last_five, @macro=:composed_of> 
      
    >> Purchase.delete_all 
    => 1 
      
    ?> Purchase.create(:last_five => LastFive.new("3,4,5")) 
    => #<Purchase id: 2, name: nil, last_five: "3,4,5"> 
      
    >> purchase = Purchase.find(:first) 
    => #<Purchase id: 2, name: nil, last_five: "3,4,5"> 
      
    >> puts purchase.last_five.list[1]     #=>  4 
    4 
    => nil 
      
      
    ?> class Name 
    >>   attr_reader :first, :initials, :last 
      
    >>   def initialize(first, initials, last) 
    >>     @first = first 
    >>     @initials = initials 
    >>     @last = last 
    >>   end 
      
    >>   def to_s 
    >>     [ @first, @initials, @last ].compact.join(" ") 
    >>   end 
    >> end 
    => nil 
      
    ?> class Customer < ActiveRecord::Base 
      
    >>   composed_of :name, 
    ?>               :class_name => "Name", 
    ?>               :mapping =>  
    ?>                  [ # database       ruby 
    ?>                    %w[ first_name   first ], 
    ?>                    %w[ initials     initials ], 
    ?>                    %w[ last_name    last ]  
    >>                  ] 
    >> end 
    => #<ActiveRecord::Reflection::AggregateReflection:0xb7a51c90 @options={:mapping=>[["first_name", "first"], ["initials", "initials"], ["last_name", "last"]], :class_name=>"Name"}, @active_record=Customer(id: integer, created_at: datetime, credit_limit: decimal, first_name: string, initials: string, last_name: string, last_purchase: datetime, purchase_count: integer), @name=:name, @macro=:composed_of> 
      
    >> Customer.delete_all 
    => 0 
      
    ?> name = Name.new("Dwight", "D", "Eisenhower") 
    => #<Name:0xb7a28c3c @last="Eisenhower", @initials="D", @first="Dwight"> 
      
    >> Customer.create(:credit_limit => 1000, :name => name) 
    => #<Customer id: 1, created_at: "2009-05-18 08:36:36", credit_limit: #<BigDecimal:b7a19f70,'0.1E4',4(8)>, first_name: "Dwight", initials: "D", last_name: "Eisenhower", last_purchase: nil, purchase_count: 0> 
      
    >> customer = Customer.find(:first) 
    => #<Customer id: 1, created_at: "2009-05-18 08:36:36", credit_limit: #<BigDecimal:b7a13710,'0.1E4',4(8)>, first_name: "Dwight", initials: "D", last_name: "Eisenhower", last_purchase: nil, purchase_count: 0> 
    >> puts customer.name.first    #=> Dwight 
    Dwight 
    => nil 
    >> puts customer.name.last     #=> Eisenhower 
    Eisenhower 
    => nil 
    >> puts customer.name.to_s     #=> Dwight D Eisenhower 
    Dwight D Eisenhower 
    => nil 
    >> customer.name = Name.new("Harry", nil, "Truman") 
    => #<Name:0xb79f2efc @last="Truman", @initials=nil, @first="Harry"> 
    >> customer.save 
    => true 
      
    >> >> => nil 
    
      19 ActiveRecord: Relationships Between Tables 
     
    irb e1/ar/associations.rb 
    >> $: << File.dirname(__FILE__) 
    => ["/usr/local/lib/site_ruby/1.8", "/usr/local/lib/site_ruby/1.8/i486-linux", "/usr/local/lib/site_ruby/1.8/i386-linux", "/usr/local/lib/site_ruby", "/usr/lib/ruby/vendor_ruby/1.8", "/usr/lib/ruby/vendor_ruby/1.8/i486-linux", "/usr/lib/ruby/vendor_ruby", "/usr/lib/ruby/1.8", "/usr/lib/ruby/1.8/i486-linux", "/usr/lib/ruby/1.8/i386-linux", ".", "/home/rubys/git/awdwr/data/code/e1/ar"] 
    >> require "connect" 
    => true 
    >> require "logger" 
    => [] 
      
    >> #ActiveRecord::Base.logger = Logger.new(STDOUT) 
      
    ?> require "rubygems" 
    => [] 
    >> require "activerecord" 
    => [] 
      
    >> ActiveRecord::Schema.define do 
      
    ?>   create_table :products, :force => true do |t| 
    ?>     t.string   :title 
    >>     t.text     :description 
    >>     t.string   :image_url 
    >>     t.decimal  :price, :precision => 10, :scale => 2 
    >>     t.datetime :available_at 
    >>   end 
      
    >>   create_table :line_items, :force => true do |t| 
    ?>     t.integer :product_id 
    >>     t.integer :order_id 
    >>     t.integer :quantity 
    >>     t.integer :unit_price, :precision => 8, :scale => 2 
    >>   end 
    >> end 
    -- create_table(:products, {:force=>true}) 
       -> 0.0492s 
    -- create_table(:line_items, {:force=>true}) 
       -> 0.0244s 
    => nil 
      
    ?> class Product < ActiveRecord::Base 
    >>   has_many :line_items 
    >> end 
    => #<Proc:0xb77c1cf0@/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.2/lib/active_record/autosave_association.rb:173> 
      
    >> class LineItem < ActiveRecord::Base 
    >>   belongs_to :product 
    >> end 
    => #<Proc:0xb77c1804@/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.2/lib/active_record/autosave_association.rb:183> 
      
    >> LineItem.delete_all 
    => 0 
      
    >> p = Product.create(:title => "Programming Ruby", :available_at => Time.now) 
    => #<Product id: 1, title: "Programming Ruby", description: nil, image_url: nil, price: nil, available_at: "2009-05-18 08:36:36"> 
    >> l = LineItem.new 
    => #<LineItem id: nil, product_id: nil, order_id: nil, quantity: nil, unit_price: nil> 
    >> l.id = 2 
    => 2 
    >> l.product = p 
    => #<Product id: 1, title: "Programming Ruby", description: nil, image_url: nil, price: nil, available_at: "2009-05-18 08:36:36"> 
    >> l.save! 
    => true 
      
    >> l = LineItem.new 
    => #<LineItem id: nil, product_id: nil, order_id: nil, quantity: nil, unit_price: nil> 
    >> l.product = p 
    => #<Product id: 1, title: "Programming Ruby", description: nil, image_url: nil, price: nil, available_at: "2009-05-18 08:36:36"> 
    >> l.save! 
    => true 
      
    >> puts "\n\nSimple Belongs to" 
     
     
    Simple Belongs to 
    => nil 
      
    ?> item = LineItem.find(2) 
    => #<LineItem id: 2, product_id: 1, order_id: nil, quantity: nil, unit_price: nil> 
      
    >> # item.product is the associated Product object 
    ?> puts "Current product is #{item.product.id}" 
    Current product is 1 
    => nil 
    >> puts item.product.title 
    Programming Ruby 
    => nil 
      
    >> item.product = Product.new(:title          => "Rails for Java Developers", 
    ?>                            :description    => "...", 
    ?>                            :image_url      => "http://....jpg", 
    ?>                            :price          => 34.95, 
    ?>                            :available_at   => Time.now) 
    => #<Product id: nil, title: "Rails for Java Developers", description: "...", image_url: "http://....jpg", price: #<BigDecimal:b793dee4,'0.3495E2',8(8)>, available_at: "2009-05-18 08:36:36"> 
    >> item.save! 
    => true 
      
    >> puts "New product is #{item.product.id}" 
    New product is 2 
    => nil 
    >> puts item.product.title 
    Rails for Java Developers 
    => nil 
      
    >> puts "\n\nCreate belongs to" 
     
     
    Create belongs to 
    => nil 
      
    >> item = LineItem.find(2) 
    => #<LineItem id: 2, product_id: 2, order_id: nil, quantity: nil, unit_price: nil> 
      
    >> # item.product is the associated Product object 
    ?> puts "Current product is #{item.product.id}" 
    Current product is 2 
    => nil 
    >> puts item.product.title 
    Rails for Java Developers 
    => nil 
      
    ?> item.create_product(:title          => "Rails Recipes", 
    ?>                     :description    => "...", 
    ?>                     :image_url      => "http://....jpg", 
    ?>                     :price          => 32.95, 
    ?>                     :available_at   => Time.now) 
    => #<Product id: 3, title: "Rails Recipes", description: "...", image_url: "http://....jpg", price: #<BigDecimal:b78fb1e8,'0.3295E2',8(8)>, available_at: "2009-05-18 08:36:36"> 
      
    >> puts "New product is #{item.product.id}" 
    New product is 3 
    => nil 
    >> puts item.product.title 
    Rails Recipes 
    => nil 
      
    >> puts "\n\nproduct belongs to" 
     
     
    product belongs to 
    => nil 
    >> item = LineItem.find(2) 
    => #<LineItem id: 2, product_id: 2, order_id: nil, quantity: nil, unit_price: nil> 
      
    >> # item.product is the associated Product object 
    ?> puts "Current product is #{item.product.id}" 
    Current product is 2 
    => nil 
    >> puts item.product.title 
    Rails for Java Developers 
    => nil 
      
    >> item = LineItem.new() 
    => #<LineItem id: nil, product_id: nil, order_id: nil, quantity: nil, unit_price: nil> 
      
    >> item.create_product(:title          => "Advanced Rails",  
    ?>                     :description    => "...", 
    ?>                     :image_url      => "http://....jpg", 
    ?>                     :price          => 34.95, 
    ?>                     :available_at   => Time.now) 
    => #<Product id: 4, title: "Advanced Rails", description: "...", image_url: "http://....jpg", price: #<BigDecimal:b78c6f74,'0.3495E2',8(8)>, available_at: "2009-05-18 08:36:36"> 
      
    >> puts "New product is #{item.product.id}" 
    New product is 4 
    => nil 
    >> puts item.product.title 
    Advanced Rails 
    => nil 
    >> item.save! 
    => true 
    >> p item.product(true) 
    #<Product id: 4, title: "Advanced Rails", description: "...", image_url: "http://....jpg", price: #<BigDecimal:b78b76c8,'0.3495E2',8(8)>, available_at: "2009-05-18 08:36:36"> 
    => nil 
      
    >> puts "=============" 
    ============= 
    => nil 
      
    >> prod = Product.find(item.product_id) 
    => #<Product id: 4, title: "Advanced Rails", description: "...", image_url: "http://....jpg", price: #<BigDecimal:b78accc8,'0.3495E2',8(8)>, available_at: "2009-05-18 08:36:36"> 
    >> p prod.line_items.size 
    1 
    => nil 
      
    irb e1/ar/sti.rb 
    >> $: << File.dirname(__FILE__) 
    => ["/usr/local/lib/site_ruby/1.8", "/usr/local/lib/site_ruby/1.8/i486-linux", "/usr/local/lib/site_ruby/1.8/i386-linux", "/usr/local/lib/site_ruby", "/usr/lib/ruby/vendor_ruby/1.8", "/usr/lib/ruby/vendor_ruby/1.8/i486-linux", "/usr/lib/ruby/vendor_ruby", "/usr/lib/ruby/1.8", "/usr/lib/ruby/1.8/i486-linux", "/usr/lib/ruby/1.8/i386-linux", ".", "/home/rubys/git/awdwr/data/code/e1/ar"] 
    >> require "connect" 
    => true 
    >> require "logger" 
    => [] 
      
    >> ActiveRecord::Base.logger = Logger.new(STDOUT) 
    => #<Logger:0xb78777a8 @level=0, @progname=nil, @formatter=nil, @default_formatter=#<Logger::Formatter:0xb7877780 @datetime_format=nil>, @logdev=#<Logger::LogDevice:0xb7877758 @dev=#<IO:0xb7c2e568>, @mutex=#<Logger::LogDevice::LogDeviceMutex:0xb7877730 @mon_entering_queue=[], @mon_count=0, @mon_owner=nil, @mon_waiting_queue=[]>, @shift_size=nil, @filename=nil, @shift_age=nil>> 
      
    >> ActiveRecord::Schema.define do 
      
    ?>   create_table :people, :force => true do |t| 
    ?>     t.string :type 
      
    >>     # common attributes 
    ?>     t.string :name 
    >>     t.string :email 
      
    >>     # attributes for type=Customer 
    ?>     t.decimal :balance, :precision => 10, :scale => 2 
      
    >>     # attributes for type=Employee 
    ?>     t.integer :reports_to 
    >>     t.integer :dept 
      
    >>     # attributes for type=Manager 
    ?>     # -- none --  
    ?>   end 
      
    >> end 
    -- create_table(:people, {:force=>true}) 
      SQL (0.2ms)   select sqlite_version(*) 
      SQL (1.2ms)   *[0m SELECT name 
     FROM sqlite_master 
     WHERE type = 'table' AND NOT name = 'sqlite_sequence' 
    *[0m 
      SQL (6.6ms)   CREATE TABLE "people" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "type" varchar(255), "name" varchar(255), "email" varchar(255), "balance" decimal(10,2), "reports_to" integer, "dept" integer)  
       -> 0.0405s 
    => nil 
      
    ?> class Person < ActiveRecord::Base 
    >> end 
    => nil 
      
    >> class Customer < Person 
    >> end 
    => nil 
      
    >> class Employee < Person 
    >>   belongs_to :boss, :class_name => "Manager", :foreign_key => :reports_to 
    >> end 
    => #<Proc:0xb7711724@/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.2/lib/active_record/autosave_association.rb:183> 
      
    >> class Manager < Employee 
    >> end 
    => nil 
      
    ?> Customer.create(:name => 'John Doe',    :email => "john@doe.com",     
    ?>                 :balance => 78.29) 
      Customer Create (0.3ms)   INSERT INTO "people" ("name", "reports_to", "type", "dept", "email", "balance") VALUES('John Doe', NULL, 'Customer', NULL, 'john@doe.com', 78.29) 
    => #<Customer id: 1, type: "Customer", name: "John Doe", email: "john@doe.com", balance: #<BigDecimal:b76dedc4,'0.7829E2',8(8)>, reports_to: nil, dept: nil> 
      
    >> wilma = Manager.create(:name  => 'Wilma Flint', :email => "wilma@here.com",   
    ?>                        :dept => 23) 
      Manager Create (0.3ms)   INSERT INTO "people" ("name", "reports_to", "type", "dept", "email", "balance") VALUES('Wilma Flint', NULL, 'Manager', 23, 'wilma@here.com', NULL) 
    => #<Manager id: 2, type: "Manager", name: "Wilma Flint", email: "wilma@here.com", balance: nil, reports_to: nil, dept: 23> 
      
    >> Customer.create(:name => 'Bert Public', :email => "b@public.net",     
    ?>                 :balance => 12.45) 
      Customer Create (0.3ms)   INSERT INTO "people" ("name", "reports_to", "type", "dept", "email", "balance") VALUES('Bert Public', NULL, 'Customer', NULL, 'b@public.net', 12.45) 
    => #<Customer id: 3, type: "Customer", name: "Bert Public", email: "b@public.net", balance: #<BigDecimal:b79fad14,'0.1245E2',8(8)>, reports_to: nil, dept: nil> 
      
    >> barney = Employee.new(:name => 'Barney Rub',  :email => "barney@here.com",  
    ?>                       :dept => 23) 
    => #<Employee id: nil, type: "Employee", name: "Barney Rub", email: "barney@here.com", balance: nil, reports_to: nil, dept: 23> 
    >> barney.boss = wilma 
    => #<Manager id: 2, type: "Manager", name: "Wilma Flint", email: "wilma@here.com", balance: nil, reports_to: nil, dept: 23> 
    >> barney.save! 
      Employee Create (0.3ms)   INSERT INTO "people" ("name", "reports_to", "type", "dept", "email", "balance") VALUES('Barney Rub', 2, 'Employee', 23, 'barney@here.com', NULL) 
    => true 
      
    >> manager = Person.find_by_name("Wilma Flint") 
      Person Load (0.3ms)   SELECT * FROM "people" WHERE ("people"."name" = 'Wilma Flint') LIMIT 1 
    => #<Manager id: 2, type: "Manager", name: "Wilma Flint", email: "wilma@here.com", balance: nil, reports_to: nil, dept: 23> 
    >> puts manager.class    #=> Manager 
    Manager 
    => nil 
    >> puts manager.email    #=> wilma@here.com 
    wilma@here.com 
    => nil 
    >> puts manager.dept     #=> 23 
    23 
    => nil 
      
    >> customer = Person.find_by_name("Bert Public") 
      Person Load (0.4ms)   SELECT * FROM "people" WHERE ("people"."name" = 'Bert Public') LIMIT 1 
    => #<Customer id: 3, type: "Customer", name: "Bert Public", email: "b@public.net", balance: #<BigDecimal:b787eda0,'0.1245E2',8(8)>, reports_to: nil, dept: nil> 
    >> puts customer.class    #=> Customer 
    Customer 
    => nil 
    >> puts customer.email    #=> b@public.net 
    b@public.net 
    => nil 
    >> puts customer.balance  #=> 12.45 
    12.45 
    => nil 
      
    >> b = Person.find_by_name("Barney Rub") 
      Person Load (0.4ms)   SELECT * FROM "people" WHERE ("people"."name" = 'Barney Rub') LIMIT 1 
    => #<Employee id: 4, type: "Employee", name: "Barney Rub", email: "barney@here.com", balance: nil, reports_to: 2, dept: 23> 
    >> p b.boss 
      Manager Load (0.3ms)   SELECT * FROM "people" WHERE ("people"."id" = 2) AND ( ("people"."type" = 'Manager' ) )  
    #<Manager id: 2, type: "Manager", name: "Wilma Flint", email: "wilma@here.com", balance: nil, reports_to: nil, dept: 23> 
    => nil 
      
    irb e1/ar/polymorphic.rb 1 
    >> $: << File.dirname(__FILE__) 
    => ["/usr/local/lib/site_ruby/1.8", "/usr/local/lib/site_ruby/1.8/i486-linux", "/usr/local/lib/site_ruby/1.8/i386-linux", "/usr/local/lib/site_ruby", "/usr/lib/ruby/vendor_ruby/1.8", "/usr/lib/ruby/vendor_ruby/1.8/i486-linux", "/usr/lib/ruby/vendor_ruby", "/usr/lib/ruby/1.8", "/usr/lib/ruby/1.8/i486-linux", "/usr/lib/ruby/1.8/i386-linux", ".", "/home/rubys/git/awdwr/data/code/e1/ar"] 
    >> require "connect" 
    => true 
    >> require "logger" 
    => [] 
      
    >> #ActiveRecord::Base.logger = Logger.new(STDOUT) 
      
    ?> require "rubygems" 
    => [] 
    >> require "activerecord" 
    => [] 
      
    >> if ARGV.empty? or ARGV.first == '1' 
    >>   ActiveRecord::Schema.define do 
      
    ?>     create_table :catalog_entries, :force => true do |t| 
    ?>       t.string :name 
    >>       t.datetime :acquired_at 
    >>       t.integer :resource_id 
    >>       t.string :resource_type 
    >>     end 
      
    ?>     create_table :articles, :force => true do |t| 
    ?>       t.text :content 
    >>     end 
      
    >>     create_table :sounds, :force => true do |t| 
    ?>       t.binary :content 
    >>     end 
      
    >>     create_table :images, :force => true do |t| 
    ?>       t.binary :content 
    >>     end 
      
    >>   end 
    >> end 
    -- create_table(:catalog_entries, {:force=>true}) 
       -> 0.0471s 
    -- create_table(:articles, {:force=>true}) 
       -> 0.0079s 
    -- create_table(:sounds, {:force=>true}) 
       -> 0.0073s 
    -- create_table(:images, {:force=>true}) 
       -> 0.0124s 
    => nil 
      
    ?> class CatalogEntry < ActiveRecord::Base 
    >>   belongs_to :resource, :polymorphic => true 
    >> end 
    => #<Proc:0xb7816804@/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.2/lib/active_record/autosave_association.rb:183> 
      
    ?> class Article < ActiveRecord::Base 
    >>   has_one :catalog_entry, :as => :resource 
    >> end 
    => #<Proc:0xb7816804@/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.2/lib/active_record/autosave_association.rb:183> 
      
    >> class Sound < ActiveRecord::Base 
    >>   has_one :catalog_entry, :as => :resource 
    >> end 
    => #<Proc:0xb7816804@/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.2/lib/active_record/autosave_association.rb:183> 
      
    >> class Image < ActiveRecord::Base 
    >>   has_one :catalog_entry, :as => :resource 
    >> end 
    => #<Proc:0xb7816804@/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.2/lib/active_record/autosave_association.rb:183> 
      
    >> case ARGV.shift 
    >> when "1" 
    >>   a = Article.new(:content => "This is my new article") 
    >>   c = CatalogEntry.new(:name => 'Article One', :acquired_at => Time.now) 
    >>   c.resource = a 
    >>   c.save! 
    ?>   article = Article.find(1) 
    >>   p article.catalog_entry.name  #=> "Article One" 
      
    >>   cat = CatalogEntry.find(1) 
    >>   resource = cat.resource  
    >>   p resource                    #=> #<Article:0x640d80 @attributes={"id"=>"1",  
    >>                                 #     "content"=>"This is my new article"}> 
      
    ?> when "2" 
    >>   c = CatalogEntry.new(:name => 'Article One', :acquired_at => Time.now) 
    >>   c.resource = Article.new(:content => "This is my new article") 
    >>   c.save! 
      
    >>   c = CatalogEntry.new(:name => 'Image One', :acquired_at => Time.now) 
    >>   c.resource = Image.new(:content => "some binary data") 
    >>   c.save! 
      
    >>   c = CatalogEntry.new(:name => 'Sound One', :acquired_at => Time.now) 
    >>   c.resource = Sound.new(:content => "more binary data") 
    >>   c.save! 
      
    ?>   CatalogEntry.find(:all).each do |c| 
    ?>     puts "#{c.name}:  #{c.resource.class}" 
    >>   end 
    >> else 
    ?>   a = Sound.new(:content => "ding!") 
    >>   c = CatalogEntry.new(:name => 'Sound One', :acquired_at => Time.now) 
    >>   c.resource = a 
      
    >>   c.save! 
      
    >>   c = CatalogEntry.find 1 
    >>   p c.resource 
      
    >>   a = Sound.find :first 
    >>   p a.catalog_entry 
    >> end 
    "Article One" 
    #<Article id: 1, content: "This is my new article"> 
    => nil 
      
    sqlite3> select * from articles 
         id = 1 
    content = This is my new article 
    sqlite3> select * from catalog_entries 
               id = 1 
             name = Article One 
      acquired_at = 2009-05-18 08:36:37 
      resource_id = 1 
    resource_type = Article 
    sqlite3> delete from catalog_entries 
    irb e1/ar/polymorphic.rb 2 
    >> $: << File.dirname(__FILE__) 
    => ["/usr/local/lib/site_ruby/1.8", "/usr/local/lib/site_ruby/1.8/i486-linux", "/usr/local/lib/site_ruby/1.8/i386-linux", "/usr/local/lib/site_ruby", "/usr/lib/ruby/vendor_ruby/1.8", "/usr/lib/ruby/vendor_ruby/1.8/i486-linux", "/usr/lib/ruby/vendor_ruby", "/usr/lib/ruby/1.8", "/usr/lib/ruby/1.8/i486-linux", "/usr/lib/ruby/1.8/i386-linux", ".", "/home/rubys/git/awdwr/data/code/e1/ar"] 
    >> require "connect" 
    => true 
    >> require "logger" 
    => [] 
      
    >> #ActiveRecord::Base.logger = Logger.new(STDOUT) 
      
    ?> require "rubygems" 
    => [] 
    >> require "activerecord" 
    => [] 
      
    >> if ARGV.empty? or ARGV.first == '1' 
    >>   ActiveRecord::Schema.define do 
      
    ?>     create_table :catalog_entries, :force => true do |t| 
    ?>       t.string :name 
    >>       t.datetime :acquired_at 
    >>       t.integer :resource_id 
    >>       t.string :resource_type 
    >>     end 
      
    ?>     create_table :articles, :force => true do |t| 
    ?>       t.text :content 
    >>     end 
      
    >>     create_table :sounds, :force => true do |t| 
    ?>       t.binary :content 
    >>     end 
      
    >>     create_table :images, :force => true do |t| 
    ?>       t.binary :content 
    >>     end 
      
    >>   end 
    >> end 
    => nil 
      
    ?> class CatalogEntry < ActiveRecord::Base 
    >>   belongs_to :resource, :polymorphic => true 
    >> end 
    => #<Proc:0xb7725710@/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.2/lib/active_record/autosave_association.rb:183> 
      
    ?> class Article < ActiveRecord::Base 
    >>   has_one :catalog_entry, :as => :resource 
    >> end 
    => #<Proc:0xb7725710@/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.2/lib/active_record/autosave_association.rb:183> 
      
    >> class Sound < ActiveRecord::Base 
    >>   has_one :catalog_entry, :as => :resource 
    >> end 
    => #<Proc:0xb7725710@/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.2/lib/active_record/autosave_association.rb:183> 
      
    >> class Image < ActiveRecord::Base 
    >>   has_one :catalog_entry, :as => :resource 
    >> end 
    => #<Proc:0xb7725710@/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.2/lib/active_record/autosave_association.rb:183> 
      
    >> case ARGV.shift 
    >> when "1" 
    >>   a = Article.new(:content => "This is my new article") 
    >>   c = CatalogEntry.new(:name => 'Article One', :acquired_at => Time.now) 
    >>   c.resource = a 
    >>   c.save! 
    ?>   article = Article.find(1) 
    >>   p article.catalog_entry.name  #=> "Article One" 
      
    >>   cat = CatalogEntry.find(1) 
    >>   resource = cat.resource  
    >>   p resource                    #=> #<Article:0x640d80 @attributes={"id"=>"1",  
    >>                                 #     "content"=>"This is my new article"}> 
      
    ?> when "2" 
    >>   c = CatalogEntry.new(:name => 'Article One', :acquired_at => Time.now) 
    >>   c.resource = Article.new(:content => "This is my new article") 
    >>   c.save! 
      
    >>   c = CatalogEntry.new(:name => 'Image One', :acquired_at => Time.now) 
    >>   c.resource = Image.new(:content => "some binary data") 
    >>   c.save! 
      
    >>   c = CatalogEntry.new(:name => 'Sound One', :acquired_at => Time.now) 
    >>   c.resource = Sound.new(:content => "more binary data") 
    >>   c.save! 
      
    ?>   CatalogEntry.find(:all).each do |c| 
    ?>     puts "#{c.name}:  #{c.resource.class}" 
    >>   end 
    >> else 
    ?>   a = Sound.new(:content => "ding!") 
    >>   c = CatalogEntry.new(:name => 'Sound One', :acquired_at => Time.now) 
    >>   c.resource = a 
      
    >>   c.save! 
      
    >>   c = CatalogEntry.find 1 
    >>   p c.resource 
      
    >>   a = Sound.find :first 
    >>   p a.catalog_entry 
    >> end 
    Article One:  Article 
    Image One:  Image 
    Sound One:  Sound 
    => [#<CatalogEntry id: 2, name: "Article One", acquired_at: "2009-05-18 08:36:38", resource_id: 2, resource_type: "Article">, #<CatalogEntry id: 3, name: "Image One", acquired_at: "2009-05-18 08:36:38", resource_id: 1, resource_type: "Image">, #<CatalogEntry id: 4, name: "Sound One", acquired_at: "2009-05-18 08:36:38", resource_id: 1, resource_type: "Sound">] 
      
    sqlite3> select * from articles 
         id = 1 
    content = This is my new article 
      
         id = 2 
    content = This is my new article 
    sqlite3> select * from images 
         id = 1 
    content = some binary data 
    sqlite3> select * from sounds 
         id = 1 
    content = more binary data 
    sqlite3> select * from catalog_entries 
               id = 2 
             name = Article One 
      acquired_at = 2009-05-18 08:36:38 
      resource_id = 2 
    resource_type = Article 
      
               id = 3 
             name = Image One 
      acquired_at = 2009-05-18 08:36:38 
      resource_id = 1 
    resource_type = Image 
      
               id = 4 
             name = Sound One 
      acquired_at = 2009-05-18 08:36:38 
      resource_id = 1 
    resource_type = Sound 
    irb e1/ar/self_association.rb 
    >> $: << File.dirname(__FILE__) 
    => ["/usr/local/lib/site_ruby/1.8", "/usr/local/lib/site_ruby/1.8/i486-linux", "/usr/local/lib/site_ruby/1.8/i386-linux", "/usr/local/lib/site_ruby", "/usr/lib/ruby/vendor_ruby/1.8", "/usr/lib/ruby/vendor_ruby/1.8/i486-linux", "/usr/lib/ruby/vendor_ruby", "/usr/lib/ruby/1.8", "/usr/lib/ruby/1.8/i486-linux", "/usr/lib/ruby/1.8/i386-linux", ".", "/home/rubys/git/awdwr/data/code/e1/ar"] 
    >> require "connect" 
    => true 
    >> require "logger" 
    => [] 
      
    >> #ActiveRecord::Base.logger = Logger.new(STDOUT) 
      
    ?> require "rubygems" 
    => [] 
    >> require "activerecord" 
    => [] 
      
    >> ActiveRecord::Schema.define do 
    ?>   create_table :employees, :force => true do |t| 
    ?>     t.string :name 
    >>     t.integer :manager_id 
    >>     t.integer :mentor_id 
    >>   end 
    >> end 
    -- create_table(:employees, {:force=>true}) 
       -> 0.0411s 
    => nil 
      
    ?> class Employee < ActiveRecord::Base 
    >>   belongs_to :manager, 
    ?>              :class_name  => "Employee", 
    ?>              :foreign_key => "manager_id" 
      
    >>   belongs_to :mentor, 
    ?>              :class_name  => "Employee",  
    ?>              :foreign_key => "mentor_id" 
      
    >>   has_many   :mentored_employees, 
    ?>              :class_name  => "Employee", 
    ?>              :foreign_key => "mentor_id" 
      
    >>   has_many   :managed_employees, 
    ?>              :class_name  => "Employee", 
    ?>              :foreign_key => "manager_id" 
    >> end 
    => #<Proc:0xb76eacf0@/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.2/lib/active_record/autosave_association.rb:173> 
      
    ?> Employee.delete_all 
    => 0 
      
    >> adam = Employee.create(:name => "Adam") 
    => #<Employee id: 1, name: "Adam", manager_id: nil, mentor_id: nil> 
    >> beth = Employee.create(:name => "Beth") 
    => #<Employee id: 2, name: "Beth", manager_id: nil, mentor_id: nil> 
      
    >> clem = Employee.new(:name => "Clem") 
    => #<Employee id: nil, name: "Clem", manager_id: nil, mentor_id: nil> 
    >> clem.manager = adam 
    => #<Employee id: 1, name: "Adam", manager_id: nil, mentor_id: nil> 
    >> clem.mentor  = beth 
    => #<Employee id: 2, name: "Beth", manager_id: nil, mentor_id: nil> 
    >> clem.save! 
    => true 
      
    >> dawn = Employee.new(:name => "Dawn") 
    => #<Employee id: nil, name: "Dawn", manager_id: nil, mentor_id: nil> 
    >> dawn.manager = adam 
    => #<Employee id: 1, name: "Adam", manager_id: nil, mentor_id: nil> 
    >> dawn.mentor  = clem 
    => #<Employee id: 3, name: "Clem", manager_id: 1, mentor_id: 2> 
    >> dawn.save! 
    => true 
      
    ?> p adam.managed_employees.map {|e| e.name}  # => [ "Clem", "Dawn" ] 
    ["Clem", "Dawn"] 
    => nil 
    >> p adam.mentored_employees                  # => [] 
    [] 
    => nil 
    >> p dawn.mentor.name                         # => "Clem" 
    "Clem" 
    => nil 
      
      
    >> >> => nil 
    irb e1/ar/acts_as_list.rb 
    >> $: << File.dirname(__FILE__) 
    => ["/usr/local/lib/site_ruby/1.8", "/usr/local/lib/site_ruby/1.8/i486-linux", "/usr/local/lib/site_ruby/1.8/i386-linux", "/usr/local/lib/site_ruby", "/usr/lib/ruby/vendor_ruby/1.8", "/usr/lib/ruby/vendor_ruby/1.8/i486-linux", "/usr/lib/ruby/vendor_ruby", "/usr/lib/ruby/1.8", "/usr/lib/ruby/1.8/i486-linux", "/usr/lib/ruby/1.8/i386-linux", ".", "/home/rubys/git/awdwr/data/code/e1/ar"] 
    >> require "logger" 
    => true 
    >> require "rubygems" 
    => false 
    >> require "activerecord" 
    => true 
      
    >> require "vendor/plugins/acts_as_list/init" 
    => [] 
      
    >> require "connect" 
    => [] 
      
    >> #ActiveRecord::Base.logger = Logger.new(STDOUT) 
      
    ?> ActiveRecord::Base.connection.instance_eval do 
      
    ?>   create_table :parents, :force => true do |t| 
    ?>   end 
      
    >>   create_table :children, :force => true do |t| 
    ?>     t.integer :parent_id 
    >>     t.string  :name 
    >>     t.integer :position 
    >>   end 
    >> end 
    => [] 
      
      
    ?> class Parent < ActiveRecord::Base 
    >>   has_many :children, :order => :position 
    >> end 
    => #<Proc:0xb7887a90@/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.2/lib/active_record/autosave_association.rb:173> 
      
    >> class Child < ActiveRecord::Base 
    >>   belongs_to :parent 
    >>   acts_as_list  :scope => :parent 
    >> end 
    => [#<ActiveSupport::Callbacks::Callback:0xb78a994c @options={}, @identifier=nil, @method=:add_to_list_bottom, @kind=:before_create>] 
      
      
    ?> parent = Parent.create 
    => #<Parent id: 1> 
    >> %w{ One Two Three Four}.each do |name| 
    ?>   parent.children.create(:name => name) 
    >> end 
    => ["One", "Two", "Three", "Four"] 
    >> parent.save 
    => true 
      
    ?> def display_children(parent) 
    >>   puts parent.children(true).map {|child| child.name }.join(", ") 
    >> end 
    => nil 
      
    ?> display_children(parent)         #=> One, Two, Three, Four 
    One, Two, Three, Four 
    => nil 
      
    >> puts parent.children[0].first?   #=> true 
    true 
    => nil 
      
    >> two = parent.children[1] 
    => #<Child id: 2, parent_id: 1, name: "Two", position: 2> 
    >> puts two.lower_item.name         #=> Three 
    Three 
    => nil 
    >> puts two.higher_item.name        #=> One 
    One 
    => nil 
      
    >> parent.children[0].move_lower 
    => true 
    >> display_children(parent)         #=> Two, One, Three, Four 
    Two, One, Three, Four 
    => nil 
      
    >> parent.children[2].move_to_top 
    => true 
    >> display_children(parent)         #=> Three, Two, One, Four 
    Three, Two, One, Four 
    => nil 
      
    >> parent.children[2].destroy 
    => #<Child id: 1, parent_id: 1, name: "One", position: nil> 
    >> display_children(parent)         #=> Three, Two, Four 
    Three, Two, Four 
    => nil 
    >> >> => nil 
    irb e1/ar/acts_as_tree.rb 
    >> $: << File.dirname(__FILE__) 
    => ["/usr/local/lib/site_ruby/1.8", "/usr/local/lib/site_ruby/1.8/i486-linux", "/usr/local/lib/site_ruby/1.8/i386-linux", "/usr/local/lib/site_ruby", "/usr/lib/ruby/vendor_ruby/1.8", "/usr/lib/ruby/vendor_ruby/1.8/i486-linux", "/usr/lib/ruby/vendor_ruby", "/usr/lib/ruby/1.8", "/usr/lib/ruby/1.8/i486-linux", "/usr/lib/ruby/1.8/i386-linux", ".", "/home/rubys/git/awdwr/data/code/e1/ar"] 
    >> require "connect" 
    => true 
    >> require "logger" 
    => [] 
    >> require "rubygems" 
    => [] 
    >> require "activerecord" 
    => [] 
      
    >> require "vendor/plugins/acts_as_tree/lib/active_record/acts/tree.rb" 
    => [] 
    >> require "vendor/plugins/acts_as_tree/init" 
    => [] 
      
    >> #ActiveRecord::Base.logger = Logger.new(STDOUT) 
      
    ?> ActiveRecord::Schema.define do 
      
    ?>   create_table :categories, :force => true do |t| 
    ?>     t.string  :name 
    >>     t.integer :parent_id 
    >>   end 
    >> end 
    -- create_table(:categories, {:force=>true}) 
       -> 0.0392s 
    => nil 
      
      
      
      
    ?> class Category < ActiveRecord::Base 
    >>   acts_as_tree  :order => "name" 
    >> end 
    => nil 
      
      
    ?> root        = Category.create(:name => "Books") 
    => #<Category id: 1, name: "Books", parent_id: nil> 
    >> fiction     = root.children.create(:name => "Fiction") 
    => #<Category id: 2, name: "Fiction", parent_id: 1> 
    >> non_fiction = root.children.create(:name => "Non Fiction") 
    => #<Category id: 3, name: "Non Fiction", parent_id: 1> 
      
    >> non_fiction.children.create(:name => "Computers") 
    => #<Category id: 4, name: "Computers", parent_id: 3> 
    >> non_fiction.children.create(:name => "Science") 
    => #<Category id: 5, name: "Science", parent_id: 3> 
    >> non_fiction.children.create(:name => "Art History") 
    => #<Category id: 6, name: "Art History", parent_id: 3> 
      
    >> fiction.children.create(:name => "Mystery") 
    => #<Category id: 7, name: "Mystery", parent_id: 2> 
    >> fiction.children.create(:name => "Romance") 
    => #<Category id: 8, name: "Romance", parent_id: 2> 
    >> fiction.children.create(:name => "Science Fiction") 
    => #<Category id: 9, name: "Science Fiction", parent_id: 2> 
      
    >> def display_children(order) 
    >>   puts order.children.map {|child| child.name }.join(", ") 
    >> end 
    => nil 
      
    ?> display_children(root)             # Fiction, Non Fiction 
    Fiction, Non Fiction 
    => nil 
      
    >> sub_category = root.children.first 
    => #<Category id: 2, name: "Fiction", parent_id: 1> 
    >> puts sub_category.children.size    #=> 3 
    3 
    => nil 
    >> display_children(sub_category)     #=> Mystery, Romance, Science Fiction 
    Mystery, Romance, Science Fiction 
    => nil 
      
    >> non_fiction = root.children.find(:first, :conditions => "name = 'Non Fiction'") 
    => #<Category id: 3, name: "Non Fiction", parent_id: 1> 
      
    >> display_children(non_fiction)      #=> Art History, Computers, Science 
    Art History, Computers, Science 
    => nil 
    >> puts non_fiction.parent.name       #=> Books 
    Books 
    => nil 
    >> >> => nil 
    irb e1/ar/one_to_one.rb 
    >> $: << File.dirname(__FILE__) 
    => ["/usr/local/lib/site_ruby/1.8", "/usr/local/lib/site_ruby/1.8/i486-linux", "/usr/local/lib/site_ruby/1.8/i386-linux", "/usr/local/lib/site_ruby", "/usr/lib/ruby/vendor_ruby/1.8", "/usr/lib/ruby/vendor_ruby/1.8/i486-linux", "/usr/lib/ruby/vendor_ruby", "/usr/lib/ruby/1.8", "/usr/lib/ruby/1.8/i486-linux", "/usr/lib/ruby/1.8/i386-linux", ".", "/home/rubys/git/awdwr/data/code/e1/ar"] 
    >> require "connect" 
    => true 
    >> require "logger" 
    => [] 
      
    >> #ActiveRecord::Base.logger = Logger.new(STDOUT) 
      
    ?> require "rubygems" 
    => [] 
    >> require "activerecord" 
    => [] 
      
    >> ActiveRecord::Schema.define do 
      
    ?>   create_table :invoices, :force => true do |t| 
    ?>     t.integer :order_id 
    >>   end 
      
    >>   create_table :orders, :force => true do |t| 
    ?>     t.string   :name 
    >>     t.string   :email 
    >>     t.text     :address 
    >>     t.string   :pay_type 
    >>     t.datetime :shipped_at 
    >>   end 
      
    >> end 
    -- create_table(:invoices, {:force=>true}) 
       -> 0.0429s 
    -- create_table(:orders, {:force=>true}) 
       -> 0.0157s 
    => nil 
      
    ?> class Order < ActiveRecord::Base 
    >>   has_one :invoice 
    >> end 
    => #<Proc:0xb785c804@/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.2/lib/active_record/autosave_association.rb:183> 
      
    >> class Invoice < ActiveRecord::Base 
    >>   belongs_to :order 
    >> end 
    => #<Proc:0xb785c804@/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.2/lib/active_record/autosave_association.rb:183> 
      
    >> Order.create(:name => "Dave", :email => "dave@xxx", 
    ?>              :address => "123 Main St", :pay_type => "credit", 
    ?>              :shipped_at => Time.now) 
    => #<Order id: 1, name: "Dave", email: "dave@xxx", address: "123 Main St", pay_type: "credit", shipped_at: "2009-05-18 08:36:41"> 
      
      
      
    >> order = Order.find(1) 
    => #<Order id: 1, name: "Dave", email: "dave@xxx", address: "123 Main St", pay_type: "credit", shipped_at: "2009-05-18 08:36:41"> 
      
    >> p order.invoice 
    nil 
    => nil 
      
    >> invoice = Invoice.new 
    => #<Invoice id: nil, order_id: nil> 
    >> if invoice.save 
    >>   order.invoice = invoice 
    >> else 
    ?>   fail invoice.errors.to_s 
    >> end 
    => #<Invoice id: 1, order_id: 1> 
      
    >> p order.invoice 
    #<Invoice id: 1, order_id: 1> 
    => nil 
      
    >> o = Order.new 
    => #<Order id: nil, name: nil, email: nil, address: nil, pay_type: nil, shipped_at: nil> 
    >> p o.id 
    nil 
    => nil 
    >> invoice.order = o 
    => #<Order id: nil, name: nil, email: nil, address: nil, pay_type: nil, shipped_at: nil> 
    >> p o.id 
    nil 
    => nil 
    >> invoice.save 
    => true 
    >> p o.id 
    2 
    => nil 
      
    irb e1/ar/counters.rb 
    >> $: << File.dirname(__FILE__) 
    => ["/usr/local/lib/site_ruby/1.8", "/usr/local/lib/site_ruby/1.8/i486-linux", "/usr/local/lib/site_ruby/1.8/i386-linux", "/usr/local/lib/site_ruby", "/usr/lib/ruby/vendor_ruby/1.8", "/usr/lib/ruby/vendor_ruby/1.8/i486-linux", "/usr/lib/ruby/vendor_ruby", "/usr/lib/ruby/1.8", "/usr/lib/ruby/1.8/i486-linux", "/usr/lib/ruby/1.8/i386-linux", ".", "/home/rubys/git/awdwr/data/code/e1/ar"] 
    >> require "connect" 
    => true 
    >> require "logger" 
    => [] 
      
    >> #ActiveRecord::Base.logger = Logger.new(STDOUT) 
      
    ?> require "rubygems" 
    => [] 
    >> require "activerecord" 
    => [] 
      
      
    >> ActiveRecord::Schema.define do 
    ?>   create_table :products, :force => true do |t| 
    ?>     t.string :title 
    >>     t.text :description 
    >>     # ... 
    ?>     t.integer :line_items_count, :default => 0 
    >>   end 
      
    >>   create_table :line_items, :force => true do |t| 
    ?>     t.integer :product_id 
    >>     t.integer :order_id 
    >>     t.integer :quantity 
    >>     t.decimal :unit_price, :precision => 8, :scale => 2 
    >>   end 
      
    >> end 
    -- create_table(:products, {:force=>true}) 
       -> 0.0657s 
    -- create_table(:line_items, {:force=>true}) 
       -> 0.0269s 
    => nil 
      
    >> class Product < ActiveRecord::Base 
    >>   has_many :line_items 
    >> end 
    => #<Proc:0xb7871c18@/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.2/lib/active_record/autosave_association.rb:173> 
      
    ?> class LineItem < ActiveRecord::Base 
    >>   belongs_to :product, :counter_cache => true 
    >> end 
    => #<Proc:0xb787172c@/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.2/lib/active_record/autosave_association.rb:183> 
      
    ?> product = Product.create(:title => "Programming Ruby", 
    ?>                          :description => " ... ") 
    => #<Product id: 1, title: "Programming Ruby", description: " ... ", line_items_count: 0> 
    >> line_item = LineItem.new 
    => #<LineItem id: nil, product_id: nil, order_id: nil, quantity: nil, unit_price: nil> 
    >> line_item.product = product 
    => #<Product id: 1, title: "Programming Ruby", description: " ... ", line_items_count: 0> 
    >> line_item.save 
    => true 
    >> puts "In memory size = #{product.line_items.size}"             #=> 0 
    In memory size = 0 
    => nil 
    >> puts "Refreshed size = #{product.line_items(:refresh).size}"   #=> 1 
    Refreshed size = 1 
    => nil 
      
      
      
    >> LineItem.delete_all 
    => 1 
    >> Product.delete_all 
    => 1 
      
    ?> product = Product.create(:title => "Programming Ruby",  
    ?>                          :description => " ... ") 
    => #<Product id: 2, title: "Programming Ruby", description: " ... ", line_items_count: 0> 
    >> product.line_items.create 
    => #<LineItem id: 2, product_id: 2, order_id: nil, quantity: nil, unit_price: nil> 
    >> puts "In memory size = #{product.line_items.size}"             #=> 1 
    In memory size = 0 
    => nil 
    >> puts "Refreshed size = #{product.line_items(:refresh).size}"   #=> 1 
    Refreshed size = 1 
    => nil 
      
      
      
    >> >> => nil 
    
      20 ActiveRecord: Object Life Cycle 
     
    irb e1/ar/encrypt.rb 
    >> $: << File.dirname(__FILE__) 
    => ["/usr/local/lib/site_ruby/1.8", "/usr/local/lib/site_ruby/1.8/i486-linux", "/usr/local/lib/site_ruby/1.8/i386-linux", "/usr/local/lib/site_ruby", "/usr/lib/ruby/vendor_ruby/1.8", "/usr/lib/ruby/vendor_ruby/1.8/i486-linux", "/usr/lib/ruby/vendor_ruby", "/usr/lib/ruby/1.8", "/usr/lib/ruby/1.8/i486-linux", "/usr/lib/ruby/1.8/i386-linux", ".", "/home/rubys/git/awdwr/data/code/e1/ar"] 
      
    >> require "rubygems" 
    => false 
    >> gem "activerecord" 
    => true 
      
    >> require "connect" 
    => true 
      
    >> ActiveRecord::Schema.define do 
      
    ?>   create_table :orders, :force => true do |t| 
    ?>     t.integer :user_id 
    >>     t.string  :name 
    >>     t.string  :address 
    >>     t.string  :email 
    >>   end 
      
    >>   create_table :users, :force => :true do |t| 
    ?>     t.string :name 
    >>   end 
    >> end 
    -- create_table(:orders, {:force=>true}) 
       -> 0.0614s 
    -- create_table(:users, {:force=>:true}) 
       -> 0.0233s 
    => nil 
      
      
    ?> class ActiveRecord::Base 
    >>   def self.encrypt(*attr_names) 
    >>     encrypter = Encrypter.new(attr_names) 
      
    >>     before_save encrypter 
    >>     after_save  encrypter 
    >>     after_find  encrypter 
      
    >>     define_method(:after_find) { } 
    >>   end 
    >> end 
    => nil 
      
    ?> class Encrypter 
      
    >>   # We're passed a list of attributes that should 
    ?>   # be stored encrypted in the database 
    ?>   def initialize(attrs_to_manage) 
    >>     @attrs_to_manage = attrs_to_manage 
    >>   end 
      
    >>   # Before saving or updating, encrypt the fields using the NSA and 
    ?>   # DHS approved Shift Cipher 
    ?>   def before_save(model) 
    >>     @attrs_to_manage.each do |field| 
    ?>       model[field].tr!("a-z", "b-za") 
    >>     end 
    >>   end 
      
    >>   # After saving, decrypt them back 
    ?>   def after_save(model) 
    >>     @attrs_to_manage.each do |field| 
    ?>       model[field].tr!("b-za", "a-z") 
    >>     end 
    >>   end 
      
    >>   # Do the same after finding an existing record 
    ?>   alias_method :after_find, :after_save 
    >> end 
    => Encrypter 
      
    ?> class Order < ActiveRecord::Base 
    >>   encrypt(:name, :email) 
    >> end 
    => #<Proc:0x00000000@/home/rubys/git/awdwr/data/code/e1/ar/encrypt.rb:34> 
      
    ?> o = Order.new 
    => #<Order id: nil, user_id: nil, name: nil, address: nil, email: nil> 
    >> o.name = "Dave Thomas" 
    => "Dave Thomas" 
    >> o.address = "123 The Street" 
    => "123 The Street" 
    >> o.email   = "dave@pragprog.com" 
    => "dave@pragprog.com" 
    >> o.save 
    => true 
    >> puts o.name 
    Dave Thomas 
    => nil 
      
    >> o = Order.find(o.id) 
    => #<Order id: 1, user_id: nil, name: "Dave Thomas", address: "123 The Street", email: "dave@pragprog.com"> 
    >> puts o.name 
    Dave Thomas 
    => nil 
    >> >> => nil 
    sqlite3> select * from orders 
         id = 1 
    user_id =  
       name = Dbwf Tipnbt 
    address = 123 The Street 
      email = ebwf@qsbhqsph.dpn 
    irb e1/ar/observer.rb 
    >> $: << File.dirname(__FILE__) 
    => ["/usr/local/lib/site_ruby/1.8", "/usr/local/lib/site_ruby/1.8/i486-linux", "/usr/local/lib/site_ruby/1.8/i386-linux", "/usr/local/lib/site_ruby", "/usr/lib/ruby/vendor_ruby/1.8", "/usr/lib/ruby/vendor_ruby/1.8/i486-linux", "/usr/lib/ruby/vendor_ruby", "/usr/lib/ruby/1.8", "/usr/lib/ruby/1.8/i486-linux", "/usr/lib/ruby/1.8/i386-linux", ".", "/home/rubys/git/awdwr/data/code/e1/ar"] 
      
    >> require "rubygems" 
    => false 
    >> require "activerecord" 
    => true 
      
    >> require 'connect' 
    => [] 
      
    >> ActiveRecord::Base.logger = Logger.new(STDOUT) 
    => #<Logger:0xb79d8660 @level=0, @progname=nil, @formatter=nil, @default_formatter=#<Logger::Formatter:0xb79d8638 @datetime_format=nil>, @logdev=#<Logger::LogDevice:0xb79d8610 @mutex=#<Logger::LogDevice::LogDeviceMutex:0xb79d85e8 @mon_count=0, @mon_owner=nil, @mon_waiting_queue=[], @mon_entering_queue=[]>, @shift_size=nil, @filename=nil, @shift_age=nil, @dev=#<IO:0xb7d94574>>> 
      
    >> ActiveRecord::Schema.define do  
    ?>   create_table :payments, :force => true do |t| 
    ?>   end 
    >> end 
    -- create_table(:payments, {:force=>true}) 
      SQL (0.2ms)   select sqlite_version(*) 
      SQL (1.6ms)   *[0m SELECT name 
     FROM sqlite_master 
     WHERE type = 'table' AND NOT name = 'sqlite_sequence' 
    *[0m 
      SQL (9.1ms)   CREATE TABLE "payments" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)  
       -> 0.0428s 
    => nil 
      
    >> class Order < ActiveRecord::Base 
    >> end 
    => nil 
      
    >> class Payment < ActiveRecord::Base 
    >> end 
    => nil 
      
    >> class Refund < ActiveRecord::Base 
    >> end 
    => nil 
      
    ?> class OrderObserver < ActiveRecord::Observer 
    >>   def after_save(an_order) 
    >>     an_order.logger.info("Order #{an_order.id} created") 
    >>   end 
    >> end 
    => nil 
      
    >> OrderObserver.instance 
    => #<OrderObserver:0xb78e55a0> 
      
    ?> class AuditObserver < ActiveRecord::Observer 
      
    >>   observe Order, Payment, Refund 
      
    >>   def after_save(model) 
    >>     model.logger.info("[Audit] #{model.class.name} #{model.id} created") 
    >>   end 
    >> end 
    => nil 
      
    >> AuditObserver.instance 
    => #<AuditObserver:0xb78cebac> 
      
      
    >> o = Order.create 
      Order Create (0.3ms)   INSERT INTO "orders" ("name", "address", "user_id", "email") VALUES(NULL, NULL, NULL, NULL) 
    Order 2 created 
    [Audit] Order 2 created 
    => #<Order id: 2, user_id: nil, name: nil, address: nil, email: nil> 
    >> p = Payment.create 
      Payment Create (0.2ms)   INSERT INTO payments VALUES(NULL) 
    [Audit] Payment 1 created 
    => #<Payment id: 1> 
      
    ?> >>  
    irb e1/ar/attributes.rb 
    >> $: << File.dirname(__FILE__) 
    => ["/usr/local/lib/site_ruby/1.8", "/usr/local/lib/site_ruby/1.8/i486-linux", "/usr/local/lib/site_ruby/1.8/i386-linux", "/usr/local/lib/site_ruby", "/usr/lib/ruby/vendor_ruby/1.8", "/usr/lib/ruby/vendor_ruby/1.8/i486-linux", "/usr/lib/ruby/vendor_ruby", "/usr/lib/ruby/1.8", "/usr/lib/ruby/1.8/i486-linux", "/usr/lib/ruby/1.8/i386-linux", ".", "/home/rubys/git/awdwr/data/code/e1/ar"] 
    >> require "connect" 
    => true 
    >> require "logger" 
    => [] 
    >> require "pp" 
    => ["PP"] 
      
    >> #ActiveRecord::Base.logger = Logger.new(STDOUT) 
      
    ?> require "rubygems" 
    => [] 
    >> require "activerecord" 
    => [] 
      
    >> class LineItem < ActiveRecord::Base 
    >> end 
    => nil 
      
    >> LineItem.delete_all 
    => 1 
      
    >> LineItem.create(:quantity => 1, :product_id => 27, :order_id => 13, :unit_price => 29.95) 
    => #<LineItem id: 3, product_id: 27, order_id: 13, quantity: 1, unit_price: #<BigDecimal:b76ddbb8,'0.2995E2',8(8)>> 
    >> LineItem.create(:quantity => 2, :unit_price => 29.95) 
    => #<LineItem id: 4, product_id: nil, order_id: nil, quantity: 2, unit_price: #<BigDecimal:b76d11ec,'0.2995E2',8(8)>> 
    >> LineItem.create(:quantity => 1, :unit_price => 44.95) 
    => #<LineItem id: 5, product_id: nil, order_id: nil, quantity: 1, unit_price: #<BigDecimal:b76c8420,'0.4495E2',8(8)>> 
      
    >> result = LineItem.find(:first) 
    => #<LineItem id: 3, product_id: 27, order_id: 13, quantity: 1, unit_price: #<BigDecimal:b76c467c,'0.2995E2',8(8)>> 
    >> p result.quantity 
    1 
    => nil 
    >> p result.unit_price 
    #<BigDecimal:b7a528c0,'0.2995E2',8(8)> 
    => nil 
      
    >> result = LineItem.find_by_sql("select quantity, quantity*unit_price " + 
    ?>                               "from line_items") 
    => [#<LineItem quantity: 1>, #<LineItem quantity: 2>, #<LineItem quantity: 1>] 
    >> pp result[0].attributes 
    {"quantity*unit_price"=>"29.95", "quantity"=>1} 
    => nil 
      
    >> result = LineItem.find_by_sql("select quantity,  
                                          quantity*unit_price as total_price " + 
    ?>                               "from line_items") 
    => [#<LineItem quantity: 1>, #<LineItem quantity: 2>, #<LineItem quantity: 1>] 
    >> pp result[0].attributes 
    {"quantity"=>1, "total_price"=>"29.95"} 
    => nil 
      
    >> p result[0].total_price 
    "29.95" 
    => nil 
    >> sales_tax = 0.07 
    => 0.07 
    >> p result[0].total_price * sales_tax 
    "" 
    => nil 
      
    >> class LineItem < ActiveRecord::Base 
    >>   def total_price 
    >>     Float(read_attribute("total_price")) 
    >>   end 
      
    >>   CUBITS_TO_INCHES = 2.54 
      
    >>   def quantity 
    >>     read_attribute("quantity") * CUBITS_TO_INCHES 
    >>   end 
      
    >>   def quantity=(inches) 
    >>     write_attribute("quantity", Float(inches) / CUBITS_TO_INCHES) 
    >>   end 
    >> end 
    => nil 
      
    >> p result[0].quantity 
    2.54 
    => nil 
      
    >> result[0].quantity = 500 
    => 500 
    >> p result[0].save 
    true 
    => nil 
      
    ?> >>  
    sqlite3> select id, quantity*unit_price from line_items 
                     id = 3 
    quantity*unit_price = 29.95 
      
                     id = 4 
    quantity*unit_price = 59.9 
      
                     id = 5 
    quantity*unit_price = 44.95 
    irb e1/ar/transactions.rb 1 
    >> $: << File.dirname(__FILE__) 
    => ["/usr/local/lib/site_ruby/1.8", "/usr/local/lib/site_ruby/1.8/i486-linux", "/usr/local/lib/site_ruby/1.8/i386-linux", "/usr/local/lib/site_ruby", "/usr/lib/ruby/vendor_ruby/1.8", "/usr/lib/ruby/vendor_ruby/1.8/i486-linux", "/usr/lib/ruby/vendor_ruby", "/usr/lib/ruby/1.8", "/usr/lib/ruby/1.8/i486-linux", "/usr/lib/ruby/1.8/i386-linux", ".", "/home/rubys/git/awdwr/data/code/e1/ar"] 
    >> require "connect" 
    => true 
    >> require "logger" 
    => [] 
      
    >> #ActiveRecord::Base.logger = Logger.new(STDOUT) 
      
    ?> require "rubygems" 
    => [] 
    >> require "activerecord" 
    => [] 
      
      
    >> ActiveRecord::Schema.define do  
    ?>   create_table :accounts, :force => true do |t| 
    ?>     t.string  :number 
    >>     t.decimal :balance, :precision => 10, :scale => 2, :default => 0 
    >>   end 
    >> end 
    -- create_table(:accounts, {:force=>true}) 
       -> 0.0492s 
    => nil 
      
      
    ?> class Account < ActiveRecord::Base 
    >>   def self.transfer(from, to, amount) 
    >>     transaction(from, to) do 
    ?>       from.withdraw(amount) 
    >>       to.deposit(amount) 
    >>     end 
    >>   end 
      
    ?>   def withdraw(amount) 
    >>     adjust_balance_and_save(-amount) 
    >>   end 
      
    >>   def deposit(amount) 
    >>     adjust_balance_and_save(amount) 
    >>   end 
      
    >>   private 
      
    >>   def adjust_balance_and_save(amount) 
    >>     self.balance += amount 
    >>     save! 
    >>   end 
      
    >>   def validate    # validation is called by Active Record 
    >>     errors.add(:balance, "is negative") if balance < 0 
    >>   end 
    >> end 
    => nil 
      
    ?>   def adjust_balance_and_save(amount) 
    >>     self.balance += amount 
    >>   end 
    => nil 
      
    ?> peter = Account.create(:balance => 100, :number => "12345") 
    => #<Account id: 1, number: "12345", balance: #<BigDecimal:b7b89464,'0.1E3',4(8)>> 
    >> paul  = Account.create(:balance => 200, :number => "54321") 
    => #<Account id: 2, number: "54321", balance: #<BigDecimal:b7b749ec,'0.2E3',4(8)>> 
      
    >> case ARGV[0] || "1" 
      
    >> when "1" 
    >>   Account.transaction do 
    ?>     paul.deposit(10) 
    >>     peter.withdraw(10) 
    >>   end 
      
    >> when "2" 
    >>   Account.transaction do 
    ?>     paul.deposit(350) 
    >>     peter.withdraw(350) 
    >>   end 
      
    >> when "3" 
    >>   begin 
    ?>     Account.transaction do 
    ?>       paul.deposit(350) 
    >>       peter.withdraw(350) 
    >>     end 
    >>   rescue 
    >>     puts "Transfer aborted" 
    >>   end 
      
    >>   puts "Paul has #{paul.balance}" 
    >>   puts "Peter has #{peter.balance}" 
      
    >> when "4" 
    >>   begin 
    ?>     Account.transaction(peter, paul) do 
    ?>       paul.deposit(350) 
    >>       peter.withdraw(350) 
    >>     end 
    >>   rescue 
    >>     puts "Transfer aborted" 
    >>   end 
      
    >>   puts "Paul has #{paul.balance}" 
    >>   puts "Peter has #{peter.balance}" 
      
    >> when "5" 
    >>   Account.transfer(peter, paul, 350) rescue  puts "Transfer aborted" 
      
    >>   puts "Paul has #{paul.balance}" 
    >>   puts "Peter has #{peter.balance}" 
      
    >> end 
    => true 
      
      
      
    >> >> => nil 
    sqlite3> select * from accounts 
         id = 1 
     number = 12345 
    balance = 90 
      
         id = 2 
     number = 54321 
    balance = 210 
    irb e1/ar/transactions.rb 2 
    >> $: << File.dirname(__FILE__) 
    => ["/usr/local/lib/site_ruby/1.8", "/usr/local/lib/site_ruby/1.8/i486-linux", "/usr/local/lib/site_ruby/1.8/i386-linux", "/usr/local/lib/site_ruby", "/usr/lib/ruby/vendor_ruby/1.8", "/usr/lib/ruby/vendor_ruby/1.8/i486-linux", "/usr/lib/ruby/vendor_ruby", "/usr/lib/ruby/1.8", "/usr/lib/ruby/1.8/i486-linux", "/usr/lib/ruby/1.8/i386-linux", ".", "/home/rubys/git/awdwr/data/code/e1/ar"] 
    >> require "connect" 
    => true 
    >> require "logger" 
    => [] 
      
    >> #ActiveRecord::Base.logger = Logger.new(STDOUT) 
      
    ?> require "rubygems" 
    => [] 
    >> require "activerecord" 
    => [] 
      
      
    >> ActiveRecord::Schema.define do  
    ?>   create_table :accounts, :force => true do |t| 
    ?>     t.string  :number 
    >>     t.decimal :balance, :precision => 10, :scale => 2, :default => 0 
    >>   end 
    >> end 
    -- create_table(:accounts, {:force=>true}) 
       -> 0.0662s 
    => nil 
      
      
    ?> class Account < ActiveRecord::Base 
    >>   def self.transfer(from, to, amount) 
    >>     transaction(from, to) do 
    ?>       from.withdraw(amount) 
    >>       to.deposit(amount) 
    >>     end 
    >>   end 
      
    ?>   def withdraw(amount) 
    >>     adjust_balance_and_save(-amount) 
    >>   end 
      
    >>   def deposit(amount) 
    >>     adjust_balance_and_save(amount) 
    >>   end 
      
    >>   private 
      
    >>   def adjust_balance_and_save(amount) 
    >>     self.balance += amount 
    >>     save! 
    >>   end 
      
    >>   def validate    # validation is called by Active Record 
    >>     errors.add(:balance, "is negative") if balance < 0 
    >>   end 
    >> end 
    => nil 
      
    ?>   def adjust_balance_and_save(amount) 
    >>     self.balance += amount 
    >>   end 
    => nil 
      
    ?> peter = Account.create(:balance => 100, :number => "12345") 
    => #<Account id: 1, number: "12345", balance: #<BigDecimal:b7b14740,'0.1E3',4(8)>> 
    >> paul  = Account.create(:balance => 200, :number => "54321") 
    => #<Account id: 2, number: "54321", balance: #<BigDecimal:b7b00efc,'0.2E3',4(8)>> 
      
    >> case ARGV[0] || "1" 
      
    >> when "1" 
    >>   Account.transaction do 
    ?>     paul.deposit(10) 
    >>     peter.withdraw(10) 
    >>   end 
      
    >> when "2" 
    >>   Account.transaction do 
    ?>     paul.deposit(350) 
    >>     peter.withdraw(350) 
    >>   end 
      
    >> when "3" 
    >>   begin 
    ?>     Account.transaction do 
    ?>       paul.deposit(350) 
    >>       peter.withdraw(350) 
    >>     end 
    >>   rescue 
    >>     puts "Transfer aborted" 
    >>   end 
      
    >>   puts "Paul has #{paul.balance}" 
    >>   puts "Peter has #{peter.balance}" 
      
    >> when "4" 
    >>   begin 
    ?>     Account.transaction(peter, paul) do 
    ?>       paul.deposit(350) 
    >>       peter.withdraw(350) 
    >>     end 
    >>   rescue 
    >>     puts "Transfer aborted" 
    >>   end 
      
    >>   puts "Paul has #{paul.balance}" 
    >>   puts "Peter has #{peter.balance}" 
      
    >> when "5" 
    >>   Account.transfer(peter, paul, 350) rescue  puts "Transfer aborted" 
      
    >>   puts "Paul has #{paul.balance}" 
    >>   puts "Peter has #{peter.balance}" 
      
    >> end 
    ActiveRecord::RecordInvalid: Validation failed: Balance is negative 
    	from /usr/lib/ruby/gems/1.8/gems/activerecord-2.3.2/lib/active_record/validations.rb:1021:in `save_without_dirty!' 
    	from /usr/lib/ruby/gems/1.8/gems/activerecord-2.3.2/lib/active_record/dirty.rb:87:in `save_without_transactions!' 
    	from /usr/lib/ruby/gems/1.8/gems/activerecord-2.3.2/lib/active_record/transactions.rb:200:in `save!' 
    	from /usr/lib/ruby/gems/1.8/gems/activerecord-2.3.2/lib/active_record/connection_adapters/abstract/database_statements.rb:136:in `transaction' 
    	from /usr/lib/ruby/gems/1.8/gems/activerecord-2.3.2/lib/active_record/transactions.rb:182:in `transaction' 
    	from /usr/lib/ruby/gems/1.8/gems/activerecord-2.3.2/lib/active_record/transactions.rb:200:in `save!' 
    	from /usr/lib/ruby/gems/1.8/gems/activerecord-2.3.2/lib/active_record/transactions.rb:208:in `rollback_active_record_state!' 
    	from /usr/lib/ruby/gems/1.8/gems/activerecord-2.3.2/lib/active_record/transactions.rb:200:in `save!' 
    	from /home/rubys/git/awdwr/data/code/e1/ar/transactions.rb:46:in `adjust_balance_and_save' 
    	from /home/rubys/git/awdwr/data/code/e1/ar/transactions.rb:35:in `withdraw' 
    	from /home/rubys/git/awdwr/data/code/e1/ar/transactions.rb:82 
    	from /usr/lib/ruby/gems/1.8/gems/activerecord-2.3.2/lib/active_record/connection_adapters/abstract/database_statements.rb:136:in `transaction' 
    	from /usr/lib/ruby/gems/1.8/gems/activerecord-2.3.2/lib/active_record/transactions.rb:182:in `transaction' 
    	from /home/rubys/git/awdwr/data/code/e1/ar/transactions.rb:80 
    	from :0 
      
      
      
    >> >> => nil 
    sqlite3> select * from accounts 
         id = 1 
     number = 12345 
    balance = 100 
      
         id = 2 
     number = 54321 
    balance = 200 
    irb e1/ar/transactions.rb 3 
    >> $: << File.dirname(__FILE__) 
    => ["/usr/local/lib/site_ruby/1.8", "/usr/local/lib/site_ruby/1.8/i486-linux", "/usr/local/lib/site_ruby/1.8/i386-linux", "/usr/local/lib/site_ruby", "/usr/lib/ruby/vendor_ruby/1.8", "/usr/lib/ruby/vendor_ruby/1.8/i486-linux", "/usr/lib/ruby/vendor_ruby", "/usr/lib/ruby/1.8", "/usr/lib/ruby/1.8/i486-linux", "/usr/lib/ruby/1.8/i386-linux", ".", "/home/rubys/git/awdwr/data/code/e1/ar"] 
    >> require "connect" 
    => true 
    >> require "logger" 
    => [] 
      
    >> #ActiveRecord::Base.logger = Logger.new(STDOUT) 
      
    ?> require "rubygems" 
    => [] 
    >> require "activerecord" 
    => [] 
      
      
    >> ActiveRecord::Schema.define do  
    ?>   create_table :accounts, :force => true do |t| 
    ?>     t.string  :number 
    >>     t.decimal :balance, :precision => 10, :scale => 2, :default => 0 
    >>   end 
    >> end 
    -- create_table(:accounts, {:force=>true}) 
       -> 0.1149s 
    => nil 
      
      
    ?> class Account < ActiveRecord::Base 
    >>   def self.transfer(from, to, amount) 
    >>     transaction(from, to) do 
    ?>       from.withdraw(amount) 
    >>       to.deposit(amount) 
    >>     end 
    >>   end 
      
    ?>   def withdraw(amount) 
    >>     adjust_balance_and_save(-amount) 
    >>   end 
      
    >>   def deposit(amount) 
    >>     adjust_balance_and_save(amount) 
    >>   end 
      
    >>   private 
      
    >>   def adjust_balance_and_save(amount) 
    >>     self.balance += amount 
    >>     save! 
    >>   end 
      
    >>   def validate    # validation is called by Active Record 
    >>     errors.add(:balance, "is negative") if balance < 0 
    >>   end 
    >> end 
    => nil 
      
    ?>   def adjust_balance_and_save(amount) 
    >>     self.balance += amount 
    >>   end 
    => nil 
      
    ?> peter = Account.create(:balance => 100, :number => "12345") 
    => #<Account id: 1, number: "12345", balance: #<BigDecimal:b7bc3740,'0.1E3',4(8)>> 
    >> paul  = Account.create(:balance => 200, :number => "54321") 
    => #<Account id: 2, number: "54321", balance: #<BigDecimal:b7bafefc,'0.2E3',4(8)>> 
      
    >> case ARGV[0] || "1" 
      
    >> when "1" 
    >>   Account.transaction do 
    ?>     paul.deposit(10) 
    >>     peter.withdraw(10) 
    >>   end 
      
    >> when "2" 
    >>   Account.transaction do 
    ?>     paul.deposit(350) 
    >>     peter.withdraw(350) 
    >>   end 
      
    >> when "3" 
    >>   begin 
    ?>     Account.transaction do 
    ?>       paul.deposit(350) 
    >>       peter.withdraw(350) 
    >>     end 
    >>   rescue 
    >>     puts "Transfer aborted" 
    >>   end 
      
    >>   puts "Paul has #{paul.balance}" 
    >>   puts "Peter has #{peter.balance}" 
      
    >> when "4" 
    >>   begin 
    ?>     Account.transaction(peter, paul) do 
    ?>       paul.deposit(350) 
    >>       peter.withdraw(350) 
    >>     end 
    >>   rescue 
    >>     puts "Transfer aborted" 
    >>   end 
      
    >>   puts "Paul has #{paul.balance}" 
    >>   puts "Peter has #{peter.balance}" 
      
    >> when "5" 
    >>   Account.transfer(peter, paul, 350) rescue  puts "Transfer aborted" 
      
    >>   puts "Paul has #{paul.balance}" 
    >>   puts "Peter has #{peter.balance}" 
      
    >> end 
    Transfer aborted 
    Paul has 550.0 
    Peter has -250.0 
    => nil 
      
      
      
    >> >> => nil 
    irb e1/ar/transactions.rb 4 
    >> $: << File.dirname(__FILE__) 
    => ["/usr/local/lib/site_ruby/1.8", "/usr/local/lib/site_ruby/1.8/i486-linux", "/usr/local/lib/site_ruby/1.8/i386-linux", "/usr/local/lib/site_ruby", "/usr/lib/ruby/vendor_ruby/1.8", "/usr/lib/ruby/vendor_ruby/1.8/i486-linux", "/usr/lib/ruby/vendor_ruby", "/usr/lib/ruby/1.8", "/usr/lib/ruby/1.8/i486-linux", "/usr/lib/ruby/1.8/i386-linux", ".", "/home/rubys/git/awdwr/data/code/e1/ar"] 
    >> require "connect" 
    => true 
    >> require "logger" 
    => [] 
      
    >> #ActiveRecord::Base.logger = Logger.new(STDOUT) 
      
    ?> require "rubygems" 
    => [] 
    >> require "activerecord" 
    => [] 
      
      
    >> ActiveRecord::Schema.define do  
    ?>   create_table :accounts, :force => true do |t| 
    ?>     t.string  :number 
    >>     t.decimal :balance, :precision => 10, :scale => 2, :default => 0 
    >>   end 
    >> end 
    -- create_table(:accounts, {:force=>true}) 
       -> 0.0565s 
    => nil 
      
      
    ?> class Account < ActiveRecord::Base 
    >>   def self.transfer(from, to, amount) 
    >>     transaction(from, to) do 
    ?>       from.withdraw(amount) 
    >>       to.deposit(amount) 
    >>     end 
    >>   end 
      
    ?>   def withdraw(amount) 
    >>     adjust_balance_and_save(-amount) 
    >>   end 
      
    >>   def deposit(amount) 
    >>     adjust_balance_and_save(amount) 
    >>   end 
      
    >>   private 
      
    >>   def adjust_balance_and_save(amount) 
    >>     self.balance += amount 
    >>     save! 
    >>   end 
      
    >>   def validate    # validation is called by Active Record 
    >>     errors.add(:balance, "is negative") if balance < 0 
    >>   end 
    >> end 
    => nil 
      
    ?>   def adjust_balance_and_save(amount) 
    >>     self.balance += amount 
    >>   end 
    => nil 
      
    ?> peter = Account.create(:balance => 100, :number => "12345") 
    => #<Account id: 1, number: "12345", balance: #<BigDecimal:b7b4bc40,'0.1E3',4(8)>> 
    >> paul  = Account.create(:balance => 200, :number => "54321") 
    => #<Account id: 2, number: "54321", balance: #<BigDecimal:b7b387bc,'0.2E3',4(8)>> 
      
    >> case ARGV[0] || "1" 
      
    >> when "1" 
    >>   Account.transaction do 
    ?>     paul.deposit(10) 
    >>     peter.withdraw(10) 
    >>   end 
      
    >> when "2" 
    >>   Account.transaction do 
    ?>     paul.deposit(350) 
    >>     peter.withdraw(350) 
    >>   end 
      
    >> when "3" 
    >>   begin 
    ?>     Account.transaction do 
    ?>       paul.deposit(350) 
    >>       peter.withdraw(350) 
    >>     end 
    >>   rescue 
    >>     puts "Transfer aborted" 
    >>   end 
      
    >>   puts "Paul has #{paul.balance}" 
    >>   puts "Peter has #{peter.balance}" 
      
    >> when "4" 
    >>   begin 
    ?>     Account.transaction(peter, paul) do 
    ?>       paul.deposit(350) 
    >>       peter.withdraw(350) 
    >>     end 
    >>   rescue 
    >>     puts "Transfer aborted" 
    >>   end 
      
    >>   puts "Paul has #{paul.balance}" 
    >>   puts "Peter has #{peter.balance}" 
      
    >> when "5" 
    >>   Account.transfer(peter, paul, 350) rescue  puts "Transfer aborted" 
      
    >>   puts "Paul has #{paul.balance}" 
    >>   puts "Peter has #{peter.balance}" 
      
    >> end 
    Transfer aborted 
    Paul has 200.0 
    Peter has 100.0 
    => nil 
      
      
      
    >> >> => nil 
    irb e1/ar/transactions.rb 5 
    >> $: << File.dirname(__FILE__) 
    => ["/usr/local/lib/site_ruby/1.8", "/usr/local/lib/site_ruby/1.8/i486-linux", "/usr/local/lib/site_ruby/1.8/i386-linux", "/usr/local/lib/site_ruby", "/usr/lib/ruby/vendor_ruby/1.8", "/usr/lib/ruby/vendor_ruby/1.8/i486-linux", "/usr/lib/ruby/vendor_ruby", "/usr/lib/ruby/1.8", "/usr/lib/ruby/1.8/i486-linux", "/usr/lib/ruby/1.8/i386-linux", ".", "/home/rubys/git/awdwr/data/code/e1/ar"] 
    >> require "connect" 
    => true 
    >> require "logger" 
    => [] 
      
    >> #ActiveRecord::Base.logger = Logger.new(STDOUT) 
      
    ?> require "rubygems" 
    => [] 
    >> require "activerecord" 
    => [] 
      
      
    >> ActiveRecord::Schema.define do  
    ?>   create_table :accounts, :force => true do |t| 
    ?>     t.string  :number 
    >>     t.decimal :balance, :precision => 10, :scale => 2, :default => 0 
    >>   end 
    >> end 
    -- create_table(:accounts, {:force=>true}) 
       -> 0.0662s 
    => nil 
      
      
    ?> class Account < ActiveRecord::Base 
    >>   def self.transfer(from, to, amount) 
    >>     transaction(from, to) do 
    ?>       from.withdraw(amount) 
    >>       to.deposit(amount) 
    >>     end 
    >>   end 
      
    ?>   def withdraw(amount) 
    >>     adjust_balance_and_save(-amount) 
    >>   end 
      
    >>   def deposit(amount) 
    >>     adjust_balance_and_save(amount) 
    >>   end 
      
    >>   private 
      
    >>   def adjust_balance_and_save(amount) 
    >>     self.balance += amount 
    >>     save! 
    >>   end 
      
    >>   def validate    # validation is called by Active Record 
    >>     errors.add(:balance, "is negative") if balance < 0 
    >>   end 
    >> end 
    => nil 
      
    ?>   def adjust_balance_and_save(amount) 
    >>     self.balance += amount 
    >>   end 
    => nil 
      
    ?> peter = Account.create(:balance => 100, :number => "12345") 
    => #<Account id: 1, number: "12345", balance: #<BigDecimal:b7b52108,'0.1E3',4(8)>> 
    >> paul  = Account.create(:balance => 200, :number => "54321") 
    => #<Account id: 2, number: "54321", balance: #<BigDecimal:b7b3e8d8,'0.2E3',4(8)>> 
      
    >> case ARGV[0] || "1" 
      
    >> when "1" 
    >>   Account.transaction do 
    ?>     paul.deposit(10) 
    >>     peter.withdraw(10) 
    >>   end 
      
    >> when "2" 
    >>   Account.transaction do 
    ?>     paul.deposit(350) 
    >>     peter.withdraw(350) 
    >>   end 
      
    >> when "3" 
    >>   begin 
    ?>     Account.transaction do 
    ?>       paul.deposit(350) 
    >>       peter.withdraw(350) 
    >>     end 
    >>   rescue 
    >>     puts "Transfer aborted" 
    >>   end 
      
    >>   puts "Paul has #{paul.balance}" 
    >>   puts "Peter has #{peter.balance}" 
      
    >> when "4" 
    >>   begin 
    ?>     Account.transaction(peter, paul) do 
    ?>       paul.deposit(350) 
    >>       peter.withdraw(350) 
    >>     end 
    >>   rescue 
    >>     puts "Transfer aborted" 
    >>   end 
      
    >>   puts "Paul has #{paul.balance}" 
    >>   puts "Peter has #{peter.balance}" 
      
    >> when "5" 
    >>   Account.transfer(peter, paul, 350) rescue  puts "Transfer aborted" 
      
    >>   puts "Paul has #{paul.balance}" 
    >>   puts "Peter has #{peter.balance}" 
      
    >> end 
    Transfer aborted 
    Paul has 200.0 
    Peter has 100.0 
    => nil 
      
      
      
    >> >> => nil 
    irb e1/ar/optimistic.rb 
    >> $: << File.dirname(__FILE__) 
    => ["/usr/local/lib/site_ruby/1.8", "/usr/local/lib/site_ruby/1.8/i486-linux", "/usr/local/lib/site_ruby/1.8/i386-linux", "/usr/local/lib/site_ruby", "/usr/lib/ruby/vendor_ruby/1.8", "/usr/lib/ruby/vendor_ruby/1.8/i486-linux", "/usr/lib/ruby/vendor_ruby", "/usr/lib/ruby/1.8", "/usr/lib/ruby/1.8/i486-linux", "/usr/lib/ruby/1.8/i386-linux", ".", "/home/rubys/git/awdwr/data/code/e1/ar"] 
    >> require "connect" 
    => true 
      
    >> require "rubygems" 
    => [] 
    >> require "activerecord" 
    => [] 
      
    >> ActiveRecord::Schema.define do 
    ?>   create_table :counters, :force => true do |t| 
    ?>     t.integer :count 
    >>     t.integer :lock_version, :default => 0 
    >>   end 
    >> end 
    -- create_table(:counters, {:force=>true}) 
       -> 0.0556s 
    => nil 
      
      
    ?> class Counter < ActiveRecord::Base 
    >> end 
    => nil 
      
    >> Counter.delete_all 
    => 0 
    >> Counter.create(:count => 0) 
    => #<Counter id: 1, count: 0, lock_version: 0> 
      
    >> count1 = Counter.find(:first) 
    => #<Counter id: 1, count: 0, lock_version: 0> 
    >> count2 = Counter.find(:first) 
    => #<Counter id: 1, count: 0, lock_version: 0> 
      
    >> count1.count += 3  
    => 3 
    >> count1.save 
    => true 
      
    >> count2.count += 4  
    => 4 
    >> count2.save 
    ActiveRecord::StaleObjectError: Attempted to update a stale object 
    	from /usr/lib/ruby/gems/1.8/gems/activerecord-2.3.2/lib/active_record/locking/optimistic.rb:100:in `update_without_dirty' 
    	from /usr/lib/ruby/gems/1.8/gems/activerecord-2.3.2/lib/active_record/dirty.rb:146:in `update_without_timestamps' 
    	from /usr/lib/ruby/gems/1.8/gems/activerecord-2.3.2/lib/active_record/timestamp.rb:38:in `update_without_callbacks' 
    	from /usr/lib/ruby/gems/1.8/gems/activerecord-2.3.2/lib/active_record/callbacks.rb:282:in `update' 
    	from /usr/lib/ruby/gems/1.8/gems/activerecord-2.3.2/lib/active_record/base.rb:2868:in `create_or_update_without_callbacks' 
    	from /usr/lib/ruby/gems/1.8/gems/activerecord-2.3.2/lib/active_record/callbacks.rb:250:in `create_or_update' 
    	from /usr/lib/ruby/gems/1.8/gems/activerecord-2.3.2/lib/active_record/base.rb:2539:in `save_without_validation' 
    	from /usr/lib/ruby/gems/1.8/gems/activerecord-2.3.2/lib/active_record/validations.rb:1009:in `save_without_dirty' 
    	from /usr/lib/ruby/gems/1.8/gems/activerecord-2.3.2/lib/active_record/dirty.rb:79:in `save_without_transactions' 
    	from /usr/lib/ruby/gems/1.8/gems/activerecord-2.3.2/lib/active_record/transactions.rb:229:in `send' 
    	from /usr/lib/ruby/gems/1.8/gems/activerecord-2.3.2/lib/active_record/transactions.rb:229:in `with_transaction_returning_status' 
    	from /usr/lib/ruby/gems/1.8/gems/activerecord-2.3.2/lib/active_record/connection_adapters/abstract/database_statements.rb:136:in `transaction' 
    	from /usr/lib/ruby/gems/1.8/gems/activerecord-2.3.2/lib/active_record/transactions.rb:182:in `transaction' 
    	from /usr/lib/ruby/gems/1.8/gems/activerecord-2.3.2/lib/active_record/transactions.rb:228:in `with_transaction_returning_status' 
    	from /usr/lib/ruby/gems/1.8/gems/activerecord-2.3.2/lib/active_record/transactions.rb:196:in `save' 
    	from /usr/lib/ruby/gems/1.8/gems/activerecord-2.3.2/lib/active_record/transactions.rb:208:in `rollback_active_record_state!' 
    	from /usr/lib/ruby/gems/1.8/gems/activerecord-2.3.2/lib/active_record/transactions.rb:196:in `save' 
    	from /home/rubys/git/awdwr/data/code/e1/ar/optimistic.rb:31>> #END:optimistic 
    ?> >> => nil 
    
      21 Action Controller: Routing and URLs 
     
    ruby /home/rubys/git/rails/railties/bin/rails restful 
          create   
          create  app/controllers 
          create  app/helpers 
          create  app/models 
          create  app/views/layouts 
          create  config/environments 
          create  config/initializers 
          create  config/locales 
          create  db 
          create  doc 
          create  lib 
          create  lib/tasks 
          create  log 
          create  public/images 
          create  public/javascripts 
          create  public/stylesheets 
          create  script/performance 
          create  test/fixtures 
          create  test/functional 
          create  test/integration 
          create  test/performance 
          create  test/unit 
          create  vendor 
          create  vendor/plugins 
          create  tmp/sessions 
          create  tmp/sockets 
          create  tmp/cache 
          create  tmp/pids 
          create  Rakefile 
          create  README 
          create  app/controllers/application_controller.rb 
          create  app/helpers/application_helper.rb 
          create  config/database.yml 
          create  config/routes.rb 
          create  config/locales/en.yml 
          create  db/seeds.rb 
          create  config/initializers/backtrace_silencers.rb 
          create  config/initializers/inflections.rb 
          create  config/initializers/mime_types.rb 
          create  config/initializers/new_rails_defaults.rb 
          create  config/initializers/session_store.rb 
          create  config/environment.rb 
          create  config/boot.rb 
          create  config/environments/production.rb 
          create  config/environments/development.rb 
          create  config/environments/test.rb 
          create  script/about 
          create  script/console 
          create  script/dbconsole 
          create  script/destroy 
          create  script/generate 
          create  script/runner 
          create  script/server 
          create  script/plugin 
          create  script/performance/benchmarker 
          create  script/performance/profiler 
          create  test/test_helper.rb 
          create  test/performance/browsing_test.rb 
          create  public/404.html 
          create  public/422.html 
          create  public/500.html 
          create  public/index.html 
          create  public/favicon.ico 
          create  public/robots.txt 
          create  public/images/rails.png 
          create  public/javascripts/prototype.js 
          create  public/javascripts/effects.js 
          create  public/javascripts/dragdrop.js 
          create  public/javascripts/controls.js 
          create  public/javascripts/application.js 
          create  doc/README_FOR_APP 
          create  log/server.log 
          create  log/production.log 
          create  log/development.log 
          create  log/test.log 
    ln -s /home/rubys/git/rails vendor/rails 
    ruby script/generate scaffold article title:string summary:text content:text 
          exists  app/models/ 
          exists  app/controllers/ 
          exists  app/helpers/ 
          create  app/views/articles 
          exists  app/views/layouts/ 
          exists  test/functional/ 
          exists  test/unit/ 
          create  test/unit/helpers/ 
          exists  public/stylesheets/ 
          create  app/views/articles/index.html.erb 
          create  app/views/articles/show.html.erb 
          create  app/views/articles/new.html.erb 
          create  app/views/articles/edit.html.erb 
          create  app/views/layouts/articles.html.erb 
          create  public/stylesheets/scaffold.css 
          create  app/controllers/articles_controller.rb 
          create  test/functional/articles_controller_test.rb 
          create  app/helpers/articles_helper.rb 
          create  test/unit/helpers/articles_helper_test.rb 
           route  map.resources :articles 
      dependency  model 
          exists    app/models/ 
          exists    test/unit/ 
          exists    test/fixtures/ 
          create    app/models/article.rb 
          create    test/unit/article_test.rb 
          create    test/fixtures/articles.yml 
          create    db/migrate 
          create    db/migrate/20090518123648_create_articles.rb 
    rake db:migrate 
    mv 20090518123648_create_articles.rb 20080601000001_create_articles.rb 
    (in /home/rubys/git/awdwr/work/restful) 
    ==  CreateArticles: migrating ================================================= 
    -- create_table(:articles) 
       -> 0.0018s 
    ==  CreateArticles: migrated (0.0019s) ======================================== 
      
    rake routes 
    (in /home/rubys/git/awdwr/work/restful) 
        articles GET    /articles(.:format)                {:controller=>"articles", :action=>"index"} 
                 POST   /articles(.:format)                {:controller=>"articles", :action=>"create"} 
     new_article GET    /articles/new(.:format)            {:controller=>"articles", :action=>"new"} 
    edit_article GET    /articles/:id/edit(.:format)       {:controller=>"articles", :action=>"edit"} 
         article GET    /articles/:id(.:format)            {:controller=>"articles", :action=>"show"} 
                 PUT    /articles/:id(.:format)            {:controller=>"articles", :action=>"update"} 
                 DELETE /articles/:id(.:format)            {:controller=>"articles", :action=>"destroy"} 
                        /:controller/:action/:id            
                        /:controller/:action/:id(.:format)  
    edit config/routes.rb 
    ActionController::Routing::Routes.draw do |map| 
      map.resources :articles 
      
      # ... 
      
      map.connect ':controller/:action/:id' 
      map.connect ':controller/:action/:id.:format' 
    end 
    edit app/controllers/articles_controller.rb 
    class ArticlesController < ApplicationController 
      # GET /articles 
      # GET /articles.xml 
      def index 
        @articles = Article.all 
      
        respond_to do |format| 
          format.html # index.html.erb 
          format.xml  { render :xml => @articles } 
        end 
      end 
      
      # GET /articles/1 
      # GET /articles/1.xml 
      def show 
        @article = Article.find(params[:id]) 
      
        respond_to do |format| 
          format.html # show.html.erb 
          format.xml  { render :xml => @article } 
        end 
      end 
      
      # GET /articles/new 
      # GET /articles/new.xml 
      def new 
        @article = Article.new 
      
        respond_to do |format| 
          format.html # new.html.erb 
          format.xml  { render :xml => @article } 
        end 
      end 
      
      # GET /articles/1/edit 
      def edit 
        @article = Article.find(params[:id]) 
      end 
      
      # POST /articles 
      # POST /articles.xml 
      def create 
        @article = Article.new(params[:article]) 
      
        respond_to do |format| 
          if @article.save 
            flash[:notice] = 'Article was successfully created.' 
            format.html { redirect_to(@article) } 
            format.xml  { render :xml => @article, :status => :created, 
                                 :location => @article } 
          else 
            format.html { render :action => "new" } 
            format.xml  { render :xml => @article.errors, 
                                 :status => :unprocessable_entity } 
          end 
        end 
      end 
      
      # PUT /articles/1 
      # PUT /articles/1.xml 
      def update 
        @article = Article.find(params[:id]) 
      
        respond_to do |format| 
          if @article.update_attributes(params[:article]) 
            flash[:notice] = 'Article was successfully updated.' 
            format.html { redirect_to(@article) } 
            format.xml  { head :ok } 
          else 
            format.html { render :action => "edit" } 
            format.xml  { render :xml => @article.errors, 
                                 :status => :unprocessable_entity } 
          end 
        end 
      end 
      
      # DELETE /articles/1 
      # DELETE /articles/1.xml 
      def destroy 
        @article = Article.find(params[:id]) 
        @article.destroy 
      
        respond_to do |format| 
          format.html { redirect_to(articles_url) } 
          format.xml  { head :ok } 
        end 
      end 
    end 
    edit app/views/articles/index.html.erb 
    <h1>Listing articles</h1> 
      
    <table> 
      <tr> 
        <th>Title</th> 
        <th>Summary</th> 
        <th>Content</th> 
      </tr> 
      
    <% @articles.each do |article| %> 
      <tr> 
        <td><%=h article.title %></td> 
        <td><%=h article.summary %></td> 
        <td><%=h article.content %></td> 
        <td><%= link_to 'Show', article %></td> 
        <td><%= link_to 'Edit', edit_article_path(article) %></td> 
        <td><%= link_to 'Destroy', article, :confirm => 'Are you sure?', 
                                            :method => :delete %></td> 
      </tr> 
    <% end %> 
    </table> 
      
    <br /> 
      
    <%= link_to 'New article', new_article_path %> 
    edit config/routes.rb 
    ActionController::Routing::Routes.draw do |map| 
      map.resources :articles, :collection => { :recent => :get } 
      
      # ... 
      
      
      # The priority is based upon order of creation: first created -> highest priority. 
      
      # Sample of regular route: 
      #   map.connect 'products/:id', :controller => 'catalog', :action => 'view' 
      # Keep in mind you can assign values other than :controller and :action 
      
      # Sample of named route: 
      #   map.purchase 'products/:id/purchase', :controller => 'catalog', :action => 'purchase' 
      # This route can be invoked with purchase_url(:id => product.id) 
      
      # Sample resource route (maps HTTP verbs to controller actions automatically): 
      #   map.resources :products 
      
      # Sample resource route with options: 
      #   map.resources :products, :member => { :short => :get, :toggle => :post }, :collection => { :sold => :get } 
      
      # Sample resource route with sub-resources: 
      #   map.resources :products, :has_many => [ :comments, :sales ], :has_one => :seller 
       
      # Sample resource route with more complex sub-resources 
      #   map.resources :products do |products| 
      #     products.resources :comments 
      #     products.resources :sales, :collection => { :recent => :get } 
      #   end 
      
      # Sample resource route within a namespace: 
      #   map.namespace :admin do |admin| 
      #     # Directs /admin/products/* to Admin::ProductsController (app/controllers/admin/products_controller.rb) 
      #     admin.resources :products 
      #   end 
      
      # You can have the root of your site routed with map.root -- just remember to delete public/index.html. 
      # map.root :controller => "welcome" 
      
      # See how all your routes lay out with "rake routes" 
      
      # Install the default routes as the lowest priority. 
      # Note: These default routes make all actions in every controller accessible via GET requests. You should 
      # consider removing or commenting them out if you're using named routes and resources. 
      map.connect ':controller/:action/:id' 
      map.connect ':controller/:action/:id.:format' 
    end 
    rake routes 
    (in /home/rubys/git/awdwr/work/restful) 
    recent_articles GET    /articles/recent(.:format)         {:controller=>"articles", :action=>"recent"} 
           articles GET    /articles(.:format)                {:controller=>"articles", :action=>"index"} 
                    POST   /articles(.:format)                {:controller=>"articles", :action=>"create"} 
        new_article GET    /articles/new(.:format)            {:controller=>"articles", :action=>"new"} 
       edit_article GET    /articles/:id/edit(.:format)       {:controller=>"articles", :action=>"edit"} 
            article GET    /articles/:id(.:format)            {:controller=>"articles", :action=>"show"} 
                    PUT    /articles/:id(.:format)            {:controller=>"articles", :action=>"update"} 
                    DELETE /articles/:id(.:format)            {:controller=>"articles", :action=>"destroy"} 
                           /:controller/:action/:id            
                           /:controller/:action/:id(.:format)  
    edit config/routes.rb 
    ActionController::Routing::Routes.draw do |map| 
      map.resources :articles, :member => { :embargo => :put, :release => :put } 
      
      # ... 
      
      
      # The priority is based upon order of creation: first created -> highest priority. 
      
      # Sample of regular route: 
      #   map.connect 'products/:id', :controller => 'catalog', :action => 'view' 
      # Keep in mind you can assign values other than :controller and :action 
      
      # Sample of named route: 
      #   map.purchase 'products/:id/purchase', :controller => 'catalog', :action => 'purchase' 
      # This route can be invoked with purchase_url(:id => product.id) 
      
      # Sample resource route (maps HTTP verbs to controller actions automatically): 
      #   map.resources :products 
      
      # Sample resource route with options: 
      #   map.resources :products, :member => { :short => :get, :toggle => :post }, :collection => { :sold => :get } 
      
      # Sample resource route with sub-resources: 
      #   map.resources :products, :has_many => [ :comments, :sales ], :has_one => :seller 
       
      # Sample resource route with more complex sub-resources 
      #   map.resources :products do |products| 
      #     products.resources :comments 
      #     products.resources :sales, :collection => { :recent => :get } 
      #   end 
      
      # Sample resource route within a namespace: 
      #   map.namespace :admin do |admin| 
      #     # Directs /admin/products/* to Admin::ProductsController (app/controllers/admin/products_controller.rb) 
      #     admin.resources :products 
      #   end 
      
      # You can have the root of your site routed with map.root -- just remember to delete public/index.html. 
      # map.root :controller => "welcome" 
      
      # See how all your routes lay out with "rake routes" 
      
      # Install the default routes as the lowest priority. 
      # Note: These default routes make all actions in every controller accessible via GET requests. You should 
      # consider removing or commenting them out if you're using named routes and resources. 
      map.connect ':controller/:action/:id' 
      map.connect ':controller/:action/:id.:format' 
    end 
    rake routes 
    (in /home/rubys/git/awdwr/work/restful) 
           articles GET    /articles(.:format)                {:controller=>"articles", :action=>"index"} 
                    POST   /articles(.:format)                {:controller=>"articles", :action=>"create"} 
        new_article GET    /articles/new(.:format)            {:controller=>"articles", :action=>"new"} 
       edit_article GET    /articles/:id/edit(.:format)       {:controller=>"articles", :action=>"edit"} 
    release_article PUT    /articles/:id/release(.:format)    {:controller=>"articles", :action=>"release"} 
    embargo_article PUT    /articles/:id/embargo(.:format)    {:controller=>"articles", :action=>"embargo"} 
            article GET    /articles/:id(.:format)            {:controller=>"articles", :action=>"show"} 
                    PUT    /articles/:id(.:format)            {:controller=>"articles", :action=>"update"} 
                    DELETE /articles/:id(.:format)            {:controller=>"articles", :action=>"destroy"} 
                           /:controller/:action/:id            
                           /:controller/:action/:id(.:format)  
    edit config/routes.rb 
    ActionController::Routing::Routes.draw do |map| 
      map.resources :articles, :new => { :shortform => :post } 
      
      # ... 
      
      
      # The priority is based upon order of creation: first created -> highest priority. 
      
      # Sample of regular route: 
      #   map.connect 'products/:id', :controller => 'catalog', :action => 'view' 
      # Keep in mind you can assign values other than :controller and :action 
      
      # Sample of named route: 
      #   map.purchase 'products/:id/purchase', :controller => 'catalog', :action => 'purchase' 
      # This route can be invoked with purchase_url(:id => product.id) 
      
      # Sample resource route (maps HTTP verbs to controller actions automatically): 
      #   map.resources :products 
      
      # Sample resource route with options: 
      #   map.resources :products, :member => { :short => :get, :toggle => :post }, :collection => { :sold => :get } 
      
      # Sample resource route with sub-resources: 
      #   map.resources :products, :has_many => [ :comments, :sales ], :has_one => :seller 
       
      # Sample resource route with more complex sub-resources 
      #   map.resources :products do |products| 
      #     products.resources :comments 
      #     products.resources :sales, :collection => { :recent => :get } 
      #   end 
      
      # Sample resource route within a namespace: 
      #   map.namespace :admin do |admin| 
      #     # Directs /admin/products/* to Admin::ProductsController (app/controllers/admin/products_controller.rb) 
      #     admin.resources :products 
      #   end 
      
      # You can have the root of your site routed with map.root -- just remember to delete public/index.html. 
      # map.root :controller => "welcome" 
      
      # See how all your routes lay out with "rake routes" 
      
      # Install the default routes as the lowest priority. 
      # Note: These default routes make all actions in every controller accessible via GET requests. You should 
      # consider removing or commenting them out if you're using named routes and resources. 
      map.connect ':controller/:action/:id' 
      map.connect ':controller/:action/:id.:format' 
    end 
    rake routes 
    (in /home/rubys/git/awdwr/work/restful) 
                 articles GET    /articles(.:format)                {:controller=>"articles", :action=>"index"} 
                          POST   /articles(.:format)                {:controller=>"articles", :action=>"create"} 
    shortform_new_article POST   /articles/new/shortform(.:format)  {:controller=>"articles", :action=>"shortform"} 
              new_article GET    /articles/new(.:format)            {:controller=>"articles", :action=>"new"} 
             edit_article GET    /articles/:id/edit(.:format)       {:controller=>"articles", :action=>"edit"} 
                  article GET    /articles/:id(.:format)            {:controller=>"articles", :action=>"show"} 
                          PUT    /articles/:id(.:format)            {:controller=>"articles", :action=>"update"} 
                          DELETE /articles/:id(.:format)            {:controller=>"articles", :action=>"destroy"} 
                                 /:controller/:action/:id            
                                 /:controller/:action/:id(.:format)  
    edit config/routes.rb 
    ActionController::Routing::Routes.draw do |map| 
      map.resources :articles  do |article| 
        article.resources :comments 
      end 
      
      # ... 
      
      map.connect ':controller/:action/:id' 
      map.connect ':controller/:action/:id.:format' 
    end 
    rake routes 
    (in /home/rubys/git/awdwr/work/restful) 
                articles GET    /articles(.:format)                               {:controller=>"articles", :action=>"index"} 
                         POST   /articles(.:format)                               {:controller=>"articles", :action=>"create"} 
             new_article GET    /articles/new(.:format)                           {:controller=>"articles", :action=>"new"} 
            edit_article GET    /articles/:id/edit(.:format)                      {:controller=>"articles", :action=>"edit"} 
                 article GET    /articles/:id(.:format)                           {:controller=>"articles", :action=>"show"} 
                         PUT    /articles/:id(.:format)                           {:controller=>"articles", :action=>"update"} 
                         DELETE /articles/:id(.:format)                           {:controller=>"articles", :action=>"destroy"} 
        article_comments GET    /articles/:article_id/comments(.:format)          {:controller=>"comments", :action=>"index"} 
                         POST   /articles/:article_id/comments(.:format)          {:controller=>"comments", :action=>"create"} 
     new_article_comment GET    /articles/:article_id/comments/new(.:format)      {:controller=>"comments", :action=>"new"} 
    edit_article_comment GET    /articles/:article_id/comments/:id/edit(.:format) {:controller=>"comments", :action=>"edit"} 
         article_comment GET    /articles/:article_id/comments/:id(.:format)      {:controller=>"comments", :action=>"show"} 
                         PUT    /articles/:article_id/comments/:id(.:format)      {:controller=>"comments", :action=>"update"} 
                         DELETE /articles/:article_id/comments/:id(.:format)      {:controller=>"comments", :action=>"destroy"} 
                                /:controller/:action/:id                           
                                /:controller/:action/:id(.:format)                 
    ruby script/generate model comment comment:text article_id:integer 
          exists  app/models/ 
          exists  test/unit/ 
          exists  test/fixtures/ 
          create  app/models/comment.rb 
          create  test/unit/comment_test.rb 
          create  test/fixtures/comments.yml 
          exists  db/migrate 
          create  db/migrate/20090518123656_create_comments.rb 
    ruby script/generate controller comments new edit update destroy 
          exists  app/controllers/ 
          exists  app/helpers/ 
          create  app/views/comments 
          exists  test/functional/ 
          exists  test/unit/helpers/ 
          create  app/controllers/comments_controller.rb 
          create  test/functional/comments_controller_test.rb 
          create  app/helpers/comments_helper.rb 
          create  test/unit/helpers/comments_helper_test.rb 
          create  app/views/comments/new.html.erb 
          create  app/views/comments/edit.html.erb 
          create  app/views/comments/update.html.erb 
          create  app/views/comments/destroy.html.erb 
    rm app/views/comments/destroy.html.erb 
    rm app/views/comments/update.html.erb 
    edit app/models/article.rb 
    class Article < ActiveRecord::Base 
      has_many :comments 
    end 
    edit app/models/comment.rb 
    class Comment < ActiveRecord::Base 
      belongs_to :article 
    end 
    rake db:migrate 
    mv 20090518123656_create_comments.rb 20080601000002_create_comments.rb 
    (in /home/rubys/git/awdwr/work/restful) 
    ==  CreateComments: migrating ================================================= 
    -- create_table(:comments) 
       -> 0.0014s 
    ==  CreateComments: migrated (0.0014s) ======================================== 
      
    edit app/views/articles/show.html.erb 
    <p> 
      <b>Title:</b> 
      <%=h @article.title %> 
    </p> 
      
    <p> 
      <b>Summary:</b> 
      <%=h @article.summary %> 
    </p> 
      
    <p> 
      <b>Content:</b> 
      <%=h @article.content %> 
    </p> 
      
      
    <% unless @article.comments.empty? %> 
      <%= render :partial => "/comments/comment", 
    	           :collection => @article.comments %> 
    <% end %> 
     
    <%= link_to "Add comment", new_article_comment_url(@article) %> | 
    <%= link_to 'Edit', edit_article_path(@article) %> | 
    <%= link_to 'Back', articles_path %> 
    edit app/views/comments/_comment.html.erb 
    <div class="comment"> 
      <p> 
        <strong>Comment last updated: <%= comment.updated_at %></strong> 
        <%= link_to "Edit", edit_article_comment_url(:id => comment, 
                                          :article_id => comment.article) %> 
     
        <%= link_to "Delete", article_comment_url(:id => comment, 
                                          :article_id => comment.article),  
                                          :method => :delete %> 
      </p> 
      <blockquote> 
        <%=h comment.comment %> 
      </blockquote> 
     
     
    </div>                                     
    edit app/views/comments/_form.html.erb 
    <%= form.text_area  :comment, :rows => 3 %> 
    edit app/views/comments/edit.html.erb 
    <h1>Editing comment</h1> 
     
    <%= error_messages_for :comment %> 
     
    <% form_for([@article,@comment]) do |f| %> 
      <p> 
        <b>Comment</b><br /> 
        <%= f.text_area :comment %> 
      </p> 
     
      <p> 
        <b>Article</b><br /> 
        <%= f.text_field :article_id %> 
      </p> 
     
      <p> 
        <%= f.submit "Update" %> 
      </p> 
    <% end %> 
     
    <%= link_to 'Back', article_path(@article) %> 
    edit app/views/comments/new.html.erb 
    <% form_for [@article, @comment] do |form| %> 
    <fieldset> 
      <legend>Add a Comment</legend> 
    	 
      <%= render :partial => 'form', :object => form %> 
     
      <p> 
        <%= submit_tag "Create" %> 
      </p> 
    </fieldset> 
    <% end %> 
    edit app/controllers/comments_controller.rb 
    class CommentsController < ApplicationController 
      
      before_filter :find_article 
      
      def new 
        @comment = Comment.new 
      end 
      
      def edit 
        @comment = @article.comments.find(params[:id]) 
      end 
      
      def create 
        @comment = Comment.new(params[:comment]) 
        if (@article.comments << @comment) 
          redirect_to article_url(@article) 
        else 
          render :action => :new 
        end 
      end 
      
      def update 
        @comment = @article.comments.find(params[:id]) 
        if @comment.update_attributes(params[:comment]) 
          redirect_to article_url(@article) 
        else 
          render :action => :edit 
        end 
      end 
      
      def destroy 
        comment = @article.comments.find(params[:id]) 
        @article.comments.delete(comment) 
        redirect_to article_url(@article) 
      end 
      
    private 
      
      def find_article 
        @article_id = params[:article_id] 
        return(redirect_to(articles_url)) unless @article_id 
        @article = Article.find(@article_id) 
      end 
      
    end 
    ruby /home/rubys/git/rails/railties/bin/rails routing 
          create   
          create  app/controllers 
          create  app/helpers 
          create  app/models 
          create  app/views/layouts 
          create  config/environments 
          create  config/initializers 
          create  config/locales 
          create  db 
          create  doc 
          create  lib 
          create  lib/tasks 
          create  log 
          create  public/images 
          create  public/javascripts 
          create  public/stylesheets 
          create  script/performance 
          create  test/fixtures 
          create  test/functional 
          create  test/integration 
          create  test/performance 
          create  test/unit 
          create  vendor 
          create  vendor/plugins 
          create  tmp/sessions 
          create  tmp/sockets 
          create  tmp/cache 
          create  tmp/pids 
          create  Rakefile 
          create  README 
          create  app/controllers/application_controller.rb 
          create  app/helpers/application_helper.rb 
          create  config/database.yml 
          create  config/routes.rb 
          create  config/locales/en.yml 
          create  db/seeds.rb 
          create  config/initializers/backtrace_silencers.rb 
          create  config/initializers/inflections.rb 
          create  config/initializers/mime_types.rb 
          create  config/initializers/new_rails_defaults.rb 
          create  config/initializers/session_store.rb 
          create  config/environment.rb 
          create  config/boot.rb 
          create  config/environments/production.rb 
          create  config/environments/development.rb 
          create  config/environments/test.rb 
          create  script/about 
          create  script/console 
          create  script/dbconsole 
          create  script/destroy 
          create  script/generate 
          create  script/runner 
          create  script/server 
          create  script/plugin 
          create  script/performance/benchmarker 
          create  script/performance/profiler 
          create  test/test_helper.rb 
          create  test/performance/browsing_test.rb 
          create  public/404.html 
          create  public/422.html 
          create  public/500.html 
          create  public/index.html 
          create  public/favicon.ico 
          create  public/robots.txt 
          create  public/images/rails.png 
          create  public/javascripts/prototype.js 
          create  public/javascripts/effects.js 
          create  public/javascripts/dragdrop.js 
          create  public/javascripts/controls.js 
          create  public/javascripts/application.js 
          create  doc/README_FOR_APP 
          create  log/server.log 
          create  log/production.log 
          create  log/development.log 
          create  log/test.log 
    ln -s /home/rubys/git/rails vendor/rails 
    ruby script/generate controller store index add_to_cart 
          exists  app/controllers/ 
          exists  app/helpers/ 
          create  app/views/store 
          exists  test/functional/ 
          create  test/unit/helpers/ 
          create  app/controllers/store_controller.rb 
          create  test/functional/store_controller_test.rb 
          create  app/helpers/store_helper.rb 
          create  test/unit/helpers/store_helper_test.rb 
          create  app/views/store/index.html.erb 
          create  app/views/store/add_to_cart.html.erb 
    cp -v /home/rubys/git/awdwr/data/routing/* config 
    `/home/rubys/git/awdwr/data/routing/routes.rb' -> `config/routes.rb' 
    `/home/rubys/git/awdwr/data/routing/routes_with_conditions.rb' -> `config/routes_with_conditions.rb' 
    `/home/rubys/git/awdwr/data/routing/routes_with_names.rb' -> `config/routes_with_names.rb' 
    `/home/rubys/git/awdwr/data/routing/routing_conditions_test.rb' -> `config/routing_conditions_test.rb' 
    `/home/rubys/git/awdwr/data/routing/routing_test.rb' -> `config/routing_test.rb' 
    mv -v config/*_test.rb test/unit 
    `config/routing_conditions_test.rb' -> `test/unit/routing_conditions_test.rb' 
    `config/routing_test.rb' -> `test/unit/routing_test.rb' 
    rake db:schema:dump 
    (in /home/rubys/git/awdwr/work/routing) 
    rake test 
    /usr/bin/ruby1.8 -I"lib:test" "/usr/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake/rake_test_loader.rb" "test/unit/routing_test.rb" "test/unit/routing_conditions_test.rb" "test/unit/helpers/store_helper_test.rb"  
    (in /home/rubys/git/awdwr/work/routing) 
    Loaded suite /usr/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake/rake_test_loader 
    Started 
    ..... 
    Finished in 0.066047 seconds. 
      
    5 tests, 29 assertions, 0 failures, 0 errors 
    /usr/bin/ruby1.8 -I"lib:test" "/usr/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake/rake_test_loader.rb" "test/functional/store_controller_test.rb"  
    Loaded suite /usr/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake/rake_test_loader 
    Started 
    . 
    Finished in 0.040305 seconds. 
      
    1 tests, 1 assertions, 0 failures, 0 errors 
    /usr/bin/ruby1.8 -I"lib:test" "/usr/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake/rake_test_loader.rb"   
    
      21.2 Routing Requests 
     
    irb e1/routing/config/routes_for_depot.rb 
    >> require 'activesupport' 
    => true 
    >> require 'action_controller' 
    => ["Mime", "HTML", "ActionController"] 
    >> require 'action_controller/integration' 
    => [] 
      
    >> ActionController::Base.session_store = nil 
    => nil 
    >> ActionController::Routing.use_controllers! ["store", "admin", "coupon"] 
    => ["store", "admin", "coupon"] 
    >> load "config/routes.rb" 
    => [] 
    >> rs = ActionController::Routing::Routes 
    => #<ActionController::Routing::RouteSet:0xb772c1f0 @configuration_files=[], @named_routes=#<ActionController::Routing::RouteSet::NamedRouteCollection:0xb77265e8 @module=#<Module:0xb7726584>, @helpers=[:hash_for_users_url, :users_url, :hash_for_users_path, :users_path, :hash_for_new_user_url, :new_user_url, :hash_for_new_user_path, :new_user_path, :hash_for_edit_user_url, :edit_user_url, :hash_for_edit_user_path, :edit_user_path, :hash_for_user_url, :user_url, :hash_for_user_path, :user_path, :hash_for_line_items_url, :line_items_url, :hash_for_line_items_path, :line_items_path, :hash_for_new_line_item_url, :new_line_item_url, :hash_for_new_line_item_path, :new_line_item_path, :hash_for_edit_line_item_url, :edit_line_item_url, :hash_for_edit_line_item_path, :edit_line_item_path, :hash_for_line_item_url, :line_item_url, :hash_for_line_item_path, :line_item_path, :hash_for_orders_url, :orders_url, :hash_for_orders_path, :orders_path, :hash_for_new_order_url, :new_order_url, :hash_for_new_order_path, :new_order_path, :hash_for_edit_order_url, :edit_order_url, :hash_for_edit_order_path, :edit_order_path, :hash_for_order_url, :order_url, :hash_for_order_path, :order_path, :hash_for_products_url, :products_url, :hash_for_products_path, :products_path, :hash_for_new_product_url, :new_product_url, :hash_for_new_product_path, :new_product_path, :hash_for_edit_product_url, :edit_product_url, :hash_for_edit_product_path, :edit_product_path, :hash_for_product_url, :product_url, :hash_for_product_path, :product_path], @routes={:products=>#<ActionController::Routing::Route:0xb76aa5d8 @controller_requirement="products", @defaults={:controller=>"products", :action=>"index"}, @matching_prepared=true, @significant_keys=[:format, :controller, :action], @segments=[#<ActionController::Routing::DividerSegment:0xb76aaab0 @value="/", @is_optional=false, @raw=true>, #<ActionController::Routing::StaticSegment:0xb76aaa10 @value="products", @is_optional=false>, #<ActionController::Routing::OptionalFormatSegment:0xb76aa998 @is_optional=true, @key=:format>], @to_s="GET    /products(.:format)?                     {:controller=>\"products\", :action=>\"index\"}", @optimise=true, @parameter_shell={:controller=>"products", :action=>"index"}, @conditions={:method=>:get}, @requirements={:controller=>"products", :action=>"index"}, @action_requirement="index">, :edit_product=>#<ActionController::Routing::Route:0xb76960c4 @controller_requirement="products", @defaults={:controller=>"products", :action=>"edit"}, @matching_prepared=true, @significant_keys=[:id, :format, :controller, :action], @segments=[#<ActionController::Routing::DividerSegment:0xb7696a10 @value="/", @is_optional=false, @raw=true>, #<ActionController::Routing::StaticSegment:0xb7696970 @value="products", @is_optional=false>, #<ActionController::Routing::DividerSegment:0xb76968bc @value="/", @is_optional=false, @raw=true>, #<ActionController::Routing::DynamicSegment:0xb769681c @is_optional=false, @regexp=/[^\/.?]+/, @key=:id>, #<ActionController::Routing::DividerSegment:0xb7696768 @value="/", @is_optional=false, @raw=true>, #<ActionController::Routing::StaticSegment:0xb76966c8 @value="edit", @is_optional=false>, #<ActionController::Routing::OptionalFormatSegment:0xb7696650 @is_optional=true, @key=:format>], @to_s="GET    /products/:id/edit(.:format)?            {:controller=>\"products\", :action=>\"edit\"}", @optimise=false, @parameter_shell={:controller=>"products", :action=>"edit"}, @conditions={:method=>:get}, @requirements={:controller=>"products", :action=>"edit"}, @action_requirement="edit">, :new_order=>#<ActionController::Routing::Route:0xb76c5374 @controller_requirement="orders", @defaults={:controller=>"orders", :action=>"new"}, @matching_prepared=true, @significant_keys=[:format, :controller, :action], @segments=[#<ActionController::Routing::DividerSegment:0xb76c59f0 @value="/", @is_optional=false, @raw=true>, #<ActionController::Routing::StaticSegment:0xb76c5950 @value="orders", @is_optional=false>, #<ActionController::Routing::DividerSegment:0xb76c589c @value="/", @is_optional=false, @raw=true>, #<ActionController::Routing::StaticSegment:0xb76c57fc @value="new", @is_optional=false>, #<ActionController::Routing::OptionalFormatSegment:0xb76c5784 @is_optional=true, @key=:format>], @to_s="GET    /orders/new(.:format)?                   {:controller=>\"orders\", :action=>\"new\"}", @optimise=true, @parameter_shell={:controller=>"orders", :action=>"new"}, @conditions={:method=>:get}, @requirements={:controller=>"orders", :action=>"new"}, @action_requirement="new">, :new_line_item=>#<ActionController::Routing::Route:0xb76eb1f0 @controller_requirement="line_items", @defaults={:controller=>"line_items", :action=>"new"}, @matching_prepared=true, @significant_keys=[:format, :controller, :action], @segments=[#<ActionController::Routing::DividerSegment:0xb76eb86c @value="/", @is_optional=false, @raw=true>, #<ActionController::Routing::StaticSegment:0xb76eb7cc @value="line_items", @is_optional=false>, #<ActionController::Routing::DividerSegment:0xb76eb718 @value="/", @is_optional=false, @raw=true>, #<ActionController::Routing::StaticSegment:0xb76eb678 @value="new", @is_optional=false>, #<ActionController::Routing::OptionalFormatSegment:0xb76eb600 @is_optional=true, @key=:format>], @to_s="GET    /line_items/new(.:format)?               {:controller=>\"line_items\", :action=>\"new\"}", @optimise=true, @parameter_shell={:controller=>"line_items", :action=>"new"}, @conditions={:method=>:get}, @requirements={:controller=>"line_items", :action=>"new"}, @action_requirement="new">, :user=>#<ActionController::Routing::Route:0xb770206c @controller_requirement="users", @defaults={:controller=>"users", :action=>"show"}, @matching_prepared=true, @significant_keys=[:id, :format, :controller, :action], @segments=[#<ActionController::Routing::DividerSegment:0xb7702814 @value="/", @is_optional=false, @raw=true>, #<ActionController::Routing::StaticSegment:0xb7702774 @value="users", @is_optional=false>, #<ActionController::Routing::DividerSegment:0xb77026c0 @value="/", @is_optional=false, @raw=true>, #<ActionController::Routing::DynamicSegment:0xb7702620 @is_optional=false, @regexp=/[^\/.?]+/, @key=:id>, #<ActionController::Routing::OptionalFormatSegment:0xb77025a8 @is_optional=true, @key=:format>], @to_s="GET    /users/:id(.:format)?                    {:controller=>\"users\", :action=>\"show\"}", @optimise=false, @parameter_shell={:controller=>"users", :action=>"show"}, @conditions={:method=>:get}, @requirements={:controller=>"users", :action=>"show"}, @action_requirement="show">, :new_user=>#<ActionController::Routing::Route:0xb771106c @controller_requirement="users", @defaults={:controller=>"users", :action=>"new"}, @matching_prepared=true, @significant_keys=[:format, :controller, :action], @segments=[#<ActionController::Routing::DividerSegment:0xb77116e8 @value="/", @is_optional=false, @raw=true>, #<ActionController::Routing::StaticSegment:0xb7711648 @value="users", @is_optional=false>, #<ActionController::Routing::DividerSegment:0xb7711594 @value="/", @is_optional=false, @raw=true>, #<ActionController::Routing::StaticSegment:0xb77114f4 @value="new", @is_optional=false>, #<ActionController::Routing::OptionalFormatSegment:0xb771147c @is_optional=true, @key=:format>], @to_s="GET    /users/new(.:format)?                    {:controller=>\"users\", :action=>\"new\"}", @optimise=true, @parameter_shell={:controller=>"users", :action=>"new"}, @conditions={:method=>:get}, @requirements={:controller=>"users", :action=>"new"}, @action_requirement="new">, :product=>#<ActionController::Routing::Route:0xb76904f8 @controller_requirement="products", @defaults={:controller=>"products", :action=>"show"}, @matching_prepared=true, @significant_keys=[:id, :format, :controller, :action], @segments=[#<ActionController::Routing::DividerSegment:0xb7690ca0 @value="/", @is_optional=false, @raw=true>, #<ActionController::Routing::StaticSegment:0xb7690c00 @value="products", @is_optional=false>, #<ActionController::Routing::DividerSegment:0xb7690b4c @value="/", @is_optional=false, @raw=true>, #<ActionController::Routing::DynamicSegment:0xb7690aac @is_optional=false, @regexp=/[^\/.?]+/, @key=:id>, #<ActionController::Routing::OptionalFormatSegment:0xb7690a34 @is_optional=true, @key=:format>], @to_s="GET    /products/:id(.:format)?                 {:controller=>\"products\", :action=>\"show\"}", @optimise=false, @parameter_shell={:controller=>"products", :action=>"show"}, @conditions={:method=>:get}, @requirements={:controller=>"products", :action=>"show"}, @action_requirement="show">, :edit_order=>#<ActionController::Routing::Route:0xb76bbf40 @controller_requirement="orders", @defaults={:controller=>"orders", :action=>"edit"}, @matching_prepared=true, @significant_keys=[:id, :format, :controller, :action], @segments=[#<ActionController::Routing::DividerSegment:0xb76bc88c @value="/", @is_optional=false, @raw=true>, #<ActionController::Routing::StaticSegment:0xb76bc7ec @value="orders", @is_optional=false>, #<ActionController::Routing::DividerSegment:0xb76bc738 @value="/", @is_optional=false, @raw=true>, #<ActionController::Routing::DynamicSegment:0xb76bc698 @is_optional=false, @regexp=/[^\/.?]+/, @key=:id>, #<ActionController::Routing::DividerSegment:0xb76bc5e4 @value="/", @is_optional=false, @raw=true>, #<ActionController::Routing::StaticSegment:0xb76bc544 @value="edit", @is_optional=false>, #<ActionController::Routing::OptionalFormatSegment:0xb76bc4cc @is_optional=true, @key=:format>], @to_s="GET    /orders/:id/edit(.:format)?              {:controller=>\"orders\", :action=>\"edit\"}", @optimise=false, @parameter_shell={:controller=>"orders", :action=>"edit"}, @conditions={:method=>:get}, @requirements={:controller=>"orders", :action=>"edit"}, @action_requirement="edit">, :order=>#<ActionController::Routing::Route:0xb76b6374 @controller_requirement="orders", @defaults={:controller=>"orders", :action=>"show"}, @matching_prepared=true, @significant_keys=[:id, :format, :controller, :action], @segments=[#<ActionController::Routing::DividerSegment:0xb76b6b1c @value="/", @is_optional=false, @raw=true>, #<ActionController::Routing::StaticSegment:0xb76b6a7c @value="orders", @is_optional=false>, #<ActionController::Routing::DividerSegment:0xb76b69c8 @value="/", @is_optional=false, @raw=true>, #<ActionController::Routing::DynamicSegment:0xb76b6928 @is_optional=false, @regexp=/[^\/.?]+/, @key=:id>, #<ActionController::Routing::OptionalFormatSegment:0xb76b68b0 @is_optional=true, @key=:format>], @to_s="GET    /orders/:id(.:format)?                   {:controller=>\"orders\", :action=>\"show\"}", @optimise=false, @parameter_shell={:controller=>"orders", :action=>"show"}, @conditions={:method=>:get}, @requirements={:controller=>"orders", :action=>"show"}, @action_requirement="show">, :edit_line_item=>#<ActionController::Routing::Route:0xb76e1dbc @controller_requirement="line_items", @defaults={:controller=>"line_items", :action=>"edit"}, @matching_prepared=true, @significant_keys=[:id, :format, :controller, :action], @segments=[#<ActionController::Routing::DividerSegment:0xb76e2708 @value="/", @is_optional=false, @raw=true>, #<ActionController::Routing::StaticSegment:0xb76e2668 @value="line_items", @is_optional=false>, #<ActionController::Routing::DividerSegment:0xb76e25b4 @value="/", @is_optional=false, @raw=true>, #<ActionController::Routing::DynamicSegment:0xb76e2514 @is_optional=false, @regexp=/[^\/.?]+/, @key=:id>, #<ActionController::Routing::DividerSegment:0xb76e2460 @value="/", @is_optional=false, @raw=true>, #<ActionController::Routing::StaticSegment:0xb76e23c0 @value="edit", @is_optional=false>, #<ActionController::Routing::OptionalFormatSegment:0xb76e2348 @is_optional=true, @key=:format>], @to_s="GET    /line_items/:id/edit(.:format)?          {:controller=>\"line_items\", :action=>\"edit\"}", @optimise=false, @parameter_shell={:controller=>"line_items", :action=>"edit"}, @conditions={:method=>:get}, @requirements={:controller=>"line_items", :action=>"edit"}, @action_requirement="edit">, :users=>#<ActionController::Routing::Route:0xb77207ec @controller_requirement="users", @defaults={:controller=>"users", :action=>"index"}, @matching_prepared=true, @significant_keys=[:format, :controller, :action], @segments=[#<ActionController::Routing::DividerSegment:0xb7720cc4 @value="/", @is_optional=false, @raw=true>, #<ActionController::Routing::StaticSegment:0xb7720c24 @value="users", @is_optional=false>, #<ActionController::Routing::OptionalFormatSegment:0xb7720bac @is_optional=true, @key=:format>], @to_s="GET    /users(.:format)?                        {:controller=>\"users\", :action=>\"index\"}", @optimise=true, @parameter_shell={:controller=>"users", :action=>"index"}, @conditions={:method=>:get}, @requirements={:controller=>"users", :action=>"index"}, @action_requirement="index">, :edit_user=>#<ActionController::Routing::Route:0xb7707c38 @controller_requirement="users", @defaults={:controller=>"users", :action=>"edit"}, @matching_prepared=true, @significant_keys=[:id, :format, :controller, :action], @segments=[#<ActionController::Routing::DividerSegment:0xb7708584 @value="/", @is_optional=false, @raw=true>, #<ActionController::Routing::StaticSegment:0xb77084e4 @value="users", @is_optional=false>, #<ActionController::Routing::DividerSegment:0xb7708430 @value="/", @is_optional=false, @raw=true>, #<ActionController::Routing::DynamicSegment:0xb7708390 @is_optional=false, @regexp=/[^\/.?]+/, @key=:id>, #<ActionController::Routing::DividerSegment:0xb77082dc @value="/", @is_optional=false, @raw=true>, #<ActionController::Routing::StaticSegment:0xb770823c @value="edit", @is_optional=false>, #<ActionController::Routing::OptionalFormatSegment:0xb77081c4 @is_optional=true, @key=:format>], @to_s="GET    /users/:id/edit(.:format)?               {:controller=>\"users\", :action=>\"edit\"}", @optimise=false, @parameter_shell={:controller=>"users", :action=>"edit"}, @conditions={:method=>:get}, @requirements={:controller=>"users", :action=>"edit"}, @action_requirement="edit">, :line_items=>#<ActionController::Routing::Route:0xb76f62d0 @controller_requirement="line_items", @defaults={:controller=>"line_items", :action=>"index"}, @matching_prepared=true, @significant_keys=[:format, :controller, :action], @segments=[#<ActionController::Routing::DividerSegment:0xb76f67a8 @value="/", @is_optional=false, @raw=true>, #<ActionController::Routing::StaticSegment:0xb76f6708 @value="line_items", @is_optional=false>, #<ActionController::Routing::OptionalFormatSegment:0xb76f6690 @is_optional=true, @key=:format>], @to_s="GET    /line_items(.:format)?                   {:controller=>\"line_items\", :action=>\"index\"}", @optimise=true, @parameter_shell={:controller=>"line_items", :action=>"index"}, @conditions={:method=>:get}, @requirements={:controller=>"line_items", :action=>"index"}, @action_requirement="index">, :line_item=>#<ActionController::Routing::Route:0xb76dc1f0 @controller_requirement="line_items", @defaults={:controller=>"line_items", :action=>"show"}, @matching_prepared=true, @significant_keys=[:id, :format, :controller, :action], @segments=[#<ActionController::Routing::DividerSegment:0xb76dc998 @value="/", @is_optional=false, @raw=true>, #<ActionController::Routing::StaticSegment:0xb76dc8f8 @value="line_items", @is_optional=false>, #<ActionController::Routing::DividerSegment:0xb76dc844 @value="/", @is_optional=false, @raw=true>, #<ActionController::Routing::DynamicSegment:0xb76dc7a4 @is_optional=false, @regexp=/[^\/.?]+/, @key=:id>, #<ActionController::Routing::OptionalFormatSegment:0xb76dc72c @is_optional=true, @key=:format>], @to_s="GET    /line_items/:id(.:format)?               {:controller=>\"line_items\", :action=>\"show\"}", @optimise=false, @parameter_shell={:controller=>"line_items", :action=>"show"}, @conditions={:method=>:get}, @requirements={:controller=>"line_items", :action=>"show"}, @action_requirement="show">, :new_product=>#<ActionController::Routing::Route:0xb769f4f8 @controller_requirement="products", @defaults={:controller=>"products", :action=>"new"}, @matching_prepared=true, @significant_keys=[:format, :controller, :action], @segments=[#<ActionController::Routing::DividerSegment:0xb769fb74 @value="/", @is_optional=false, @raw=true>, #<ActionController::Routing::StaticSegment:0xb769fad4 @value="products", @is_optional=false>, #<ActionController::Routing::DividerSegment:0xb769fa20 @value="/", @is_optional=false, @raw=true>, #<ActionController::Routing::StaticSegment:0xb769f980 @value="new", @is_optional=false>, #<ActionController::Routing::OptionalFormatSegment:0xb769f908 @is_optional=true, @key=:format>], @to_s="GET    /products/new(.:format)?                 {:controller=>\"products\", :action=>\"new\"}", @optimise=true, @parameter_shell={:controller=>"products", :action=>"new"}, @conditions={:method=>:get}, @requirements={:controller=>"products", :action=>"new"}, @action_requirement="new">, :orders=>#<ActionController::Routing::Route:0xb76d0454 @controller_requirement="orders", @defaults={:controller=>"orders", :action=>"index"}, @matching_prepared=true, @significant_keys=[:format, :controller, :action], @segments=[#<ActionController::Routing::DividerSegment:0xb76d092c @value="/", @is_optional=false, @raw=true>, #<ActionController::Routing::StaticSegment:0xb76d088c @value="orders", @is_optional=false>, #<ActionController::Routing::OptionalFormatSegment:0xb76d0814 @is_optional=true, @key=:format>], @to_s="GET    /orders(.:format)?                       {:controller=>\"orders\", :action=>\"index\"}", @optimise=true, @parameter_shell={:controller=>"orders", :action=>"index"}, @conditions={:method=>:get}, @requirements={:controller=>"orders", :action=>"index"}, @action_requirement="index">}>, @builder=#<ActionController::Routing::RouteBuilder:0xb7720ee0 @optional_separators=["/"], @interval_regexp=/(.*?)((?-mix:[\/\.\?])|$)/, @separators=["/", ".", "?"], @nonseparator_regexp=/\A([^\/\.\?]+)/, @separator_regexp=/[\/\.\?]/>, @routes=[#<ActionController::Routing::Route:0xb77207ec @controller_requirement="users", @defaults={:controller=>"users", :action=>"index"}, @matching_prepared=true, @significant_keys=[:format, :controller, :action], @segments=[#<ActionController::Routing::DividerSegment:0xb7720cc4 @value="/", @is_optional=false, @raw=true>, #<ActionController::Routing::StaticSegment:0xb7720c24 @value="users", @is_optional=false>, #<ActionController::Routing::OptionalFormatSegment:0xb7720bac @is_optional=true, @key=:format>], @to_s="GET    /users(.:format)?                        {:controller=>\"users\", :action=>\"index\"}", @optimise=true, @parameter_shell={:controller=>"users", :action=>"index"}, @conditions={:method=>:get}, @requirements={:controller=>"users", :action=>"index"}, @action_requirement="index">, #<ActionController::Routing::Route:0xb77134ac @controller_requirement="users", @defaults={:controller=>"users", :action=>"create"}, @matching_prepared=true, @significant_keys=[:format, :controller, :action], @segments=[#<ActionController::Routing::DividerSegment:0xb7713984 @value="/", @is_optional=false, @raw=true>, #<ActionController::Routing::StaticSegment:0xb77138e4 @value="users", @is_optional=false>, #<ActionController::Routing::OptionalFormatSegment:0xb771386c @is_optional=true, @key=:format>], @to_s="POST   /users(.:format)?                        {:controller=>\"users\", :action=>\"create\"}", @optimise=true, @parameter_shell={:controller=>"users", :action=>"create"}, @conditions={:method=>:post}, @requirements={:controller=>"users", :action=>"create"}, @action_requirement="create">, #<ActionController::Routing::Route:0xb771106c @controller_requirement="users", @defaults={:controller=>"users", :action=>"new"}, @matching_prepared=true, @significant_keys=[:format, :controller, :action], @segments=[#<ActionController::Routing::DividerSegment:0xb77116e8 @value="/", @is_optional=false, @raw=true>, #<ActionController::Routing::StaticSegment:0xb7711648 @value="users", @is_optional=false>, #<ActionController::Routing::DividerSegment:0xb7711594 @value="/", @is_optional=false, @raw=true>, #<ActionController::Routing::StaticSegment:0xb77114f4 @value="new", @is_optional=false>, #<ActionController::Routing::OptionalFormatSegment:0xb771147c @is_optional=true, @key=:format>], @to_s="GET    /users/new(.:format)?                    {:controller=>\"users\", :action=>\"new\"}", @optimise=true, @parameter_shell={:controller=>"users", :action=>"new"}, @conditions={:method=>:get}, @requirements={:controller=>"users", :action=>"new"}, @action_requirement="new">, #<ActionController::Routing::Route:0xb7707c38 @controller_requirement="users", @defaults={:controller=>"users", :action=>"edit"}, @matching_prepared=true, @significant_keys=[:id, :format, :controller, :action], @segments=[#<ActionController::Routing::DividerSegment:0xb7708584 @value="/", @is_optional=false, @raw=true>, #<ActionController::Routing::StaticSegment:0xb77084e4 @value="users", @is_optional=false>, #<ActionController::Routing::DividerSegment:0xb7708430 @value="/", @is_optional=false, @raw=true>, #<ActionController::Routing::DynamicSegment:0xb7708390 @is_optional=false, @regexp=/[^\/.?]+/, @key=:id>, #<ActionController::Routing::DividerSegment:0xb77082dc @value="/", @is_optional=false, @raw=true>, #<ActionController::Routing::StaticSegment:0xb770823c @value="edit", @is_optional=false>, #<ActionController::Routing::OptionalFormatSegment:0xb77081c4 @is_optional=true, @key=:format>], @to_s="GET    /users/:id/edit(.:format)?               {:controller=>\"users\", :action=>\"edit\"}", @optimise=false, @parameter_shell={:controller=>"users", :action=>"edit"}, @conditions={:method=>:get}, @requirements={:controller=>"users", :action=>"edit"}, @action_requirement="edit">, #<ActionController::Routing::Route:0xb770206c @controller_requirement="users", @defaults={:controller=>"users", :action=>"show"}, @matching_prepared=true, @significant_keys=[:id, :format, :controller, :action], @segments=[#<ActionController::Routing::DividerSegment:0xb7702814 @value="/", @is_optional=false, @raw=true>, #<ActionController::Routing::StaticSegment:0xb7702774 @value="users", @is_optional=false>, #<ActionController::Routing::DividerSegment:0xb77026c0 @value="/", @is_optional=false, @raw=true>, #<ActionController::Routing::DynamicSegment:0xb7702620 @is_optional=false, @regexp=/[^\/.?]+/, @key=:id>, #<ActionController::Routing::OptionalFormatSegment:0xb77025a8 @is_optional=true, @key=:format>], @to_s="GET    /users/:id(.:format)?                    {:controller=>\"users\", :action=>\"show\"}", @optimise=false, @parameter_shell={:controller=>"users", :action=>"show"}, @conditions={:method=>:get}, @requirements={:controller=>"users", :action=>"show"}, @action_requirement="show">, #<ActionController::Routing::Route:0xb76fc590 @controller_requirement="users", @defaults={:controller=>"users", :action=>"update"}, @matching_prepared=true, @significant_keys=[:id, :format, :controller, :action], @segments=[#<ActionController::Routing::DividerSegment:0xb76fcd38 @value="/", @is_optional=false, @raw=true>, #<ActionController::Routing::StaticSegment:0xb76fcc98 @value="users", @is_optional=false>, #<ActionController::Routing::DividerSegment:0xb76fcbe4 @value="/", @is_optional=false, @raw=true>, #<ActionController::Routing::DynamicSegment:0xb76fcb44 @is_optional=false, @regexp=/[^\/.?]+/, @key=:id>, #<ActionController::Routing::OptionalFormatSegment:0xb76fcacc @is_optional=true, @key=:format>], @to_s="PUT    /users/:id(.:format)?                    {:controller=>\"users\", :action=>\"update\"}", @optimise=false, @parameter_shell={:controller=>"users", :action=>"update"}, @conditions={:method=>:put}, @requirements={:controller=>"users", :action=>"update"}, @action_requirement="update">, #<ActionController::Routing::Route:0xb76f94e4 @controller_requirement="users", @defaults={:controller=>"users", :action=>"destroy"}, @matching_prepared=true, @significant_keys=[:id, :format, :controller, :action], @segments=[#<ActionController::Routing::DividerSegment:0xb76f9c8c @value="/", @is_optional=false, @raw=true>, #<ActionController::Routing::StaticSegment:0xb76f9bec @value="users", @is_optional=false>, #<ActionController::Routing::DividerSegment:0xb76f9b38 @value="/", @is_optional=false, @raw=true>, #<ActionController::Routing::DynamicSegment:0xb76f9a98 @is_optional=false, @regexp=/[^\/.?]+/, @key=:id>, #<ActionController::Routing::OptionalFormatSegment:0xb76f9a20 @is_optional=true, @key=:format>], @to_s="DELETE /users/:id(.:format)?                    {:controller=>\"users\", :action=>\"destroy\"}", @optimise=false, @parameter_shell={:controller=>"users", :action=>"destroy"}, @conditions={:method=>:delete}, @requirements={:controller=>"users", :action=>"destroy"}, @action_requirement="destroy">, #<ActionController::Routing::Route:0xb76f62d0 @controller_requirement="line_items", @defaults={:controller=>"line_items", :action=>"index"}, @matching_prepared=true, @significant_keys=[:format, :controller, :action], @segments=[#<ActionController::Routing::DividerSegment:0xb76f67a8 @value="/", @is_optional=false, @raw=true>, #<ActionController::Routing::StaticSegment:0xb76f6708 @value="line_items", @is_optional=false>, #<ActionController::Routing::OptionalFormatSegment:0xb76f6690 @is_optional=true, @key=:format>], @to_s="GET    /line_items(.:format)?                   {:controller=>\"line_items\", :action=>\"index\"}", @optimise=true, @parameter_shell={:controller=>"line_items", :action=>"index"}, @conditions={:method=>:get}, @requirements={:controller=>"line_items", :action=>"index"}, @action_requirement="index">, #<ActionController::Routing::Route:0xb76ed630 @controller_requirement="line_items", @defaults={:controller=>"line_items", :action=>"create"}, @matching_prepared=true, @significant_keys=[:format, :controller, :action], @segments=[#<ActionController::Routing::DividerSegment:0xb76edb08 @value="/", @is_optional=false, @raw=true>, #<ActionController::Routing::StaticSegment:0xb76eda68 @value="line_items", @is_optional=false>, #<ActionController::Routing::OptionalFormatSegment:0xb76ed9f0 @is_optional=true, @key=:format>], @to_s="POST   /line_items(.:format)?                   {:controller=>\"line_items\", :action=>\"create\"}", @optimise=true, @parameter_shell={:controller=>"line_items", :action=>"create"}, @conditions={:method=>:post}, @requirements={:controller=>"line_items", :action=>"create"}, @action_requirement="create">, #<ActionController::Routing::Route:0xb76eb1f0 @controller_requirement="line_items", @defaults={:controller=>"line_items", :action=>"new"}, @matching_prepared=true, @significant_keys=[:format, :controller, :action], @segments=[#<ActionController::Routing::DividerSegment:0xb76eb86c @value="/", @is_optional=false, @raw=true>, #<ActionController::Routing::StaticSegment:0xb76eb7cc @value="line_items", @is_optional=false>, #<ActionController::Routing::DividerSegment:0xb76eb718 @value="/", @is_optional=false, @raw=true>, #<ActionController::Routing::StaticSegment:0xb76eb678 @value="new", @is_optional=false>, #<ActionController::Routing::OptionalFormatSegment:0xb76eb600 @is_optional=true, @key=:format>], @to_s="GET    /line_items/new(.:format)?               {:controller=>\"line_items\", :action=>\"new\"}", @optimise=true, @parameter_shell={:controller=>"line_items", :action=>"new"}, @conditions={:method=>:get}, @requirements={:controller=>"line_items", :action=>"new"}, @action_requirement="new">, #<ActionController::Routing::Route:0xb76e1dbc @controller_requirement="line_items", @defaults={:controller=>"line_items", :action=>"edit"}, @matching_prepared=true, @significant_keys=[:id, :format, :controller, :action], @segments=[#<ActionController::Routing::DividerSegment:0xb76e2708 @value="/", @is_optional=false, @raw=true>, #<ActionController::Routing::StaticSegment:0xb76e2668 @value="line_items", @is_optional=false>, #<ActionController::Routing::DividerSegment:0xb76e25b4 @value="/", @is_optional=false, @raw=true>, #<ActionController::Routing::DynamicSegment:0xb76e2514 @is_optional=false, @regexp=/[^\/.?]+/, @key=:id>, #<ActionController::Routing::DividerSegment:0xb76e2460 @value="/", @is_optional=false, @raw=true>, #<ActionController::Routing::StaticSegment:0xb76e23c0 @value="edit", @is_optional=false>, #<ActionController::Routing::OptionalFormatSegment:0xb76e2348 @is_optional=true, @key=:format>], @to_s="GET    /line_items/:id/edit(.:format)?          {:controller=>\"line_items\", :action=>\"edit\"}", @optimise=false, @parameter_shell={:controller=>"line_items", :action=>"edit"}, @conditions={:method=>:get}, @requirements={:controller=>"line_items", :action=>"edit"}, @action_requirement="edit">, #<ActionController::Routing::Route:0xb76dc1f0 @controller_requirement="line_items", @defaults={:controller=>"line_items", :action=>"show"}, @matching_prepared=true, @significant_keys=[:id, :format, :controller, :action], @segments=[#<ActionController::Routing::DividerSegment:0xb76dc998 @value="/", @is_optional=false, @raw=true>, #<ActionController::Routing::StaticSegment:0xb76dc8f8 @value="line_items", @is_optional=false>, #<ActionController::Routing::DividerSegment:0xb76dc844 @value="/", @is_optional=false, @raw=true>, #<ActionController::Routing::DynamicSegment:0xb76dc7a4 @is_optional=false, @regexp=/[^\/.?]+/, @key=:id>, #<ActionController::Routing::OptionalFormatSegment:0xb76dc72c @is_optional=true, @key=:format>], @to_s="GET    /line_items/:id(.:format)?               {:controller=>\"line_items\", :action=>\"show\"}", @optimise=false, @parameter_shell={:controller=>"line_items", :action=>"show"}, @conditions={:method=>:get}, @requirements={:controller=>"line_items", :action=>"show"}, @action_requirement="show">, #<ActionController::Routing::Route:0xb76d6714 @controller_requirement="line_items", @defaults={:controller=>"line_items", :action=>"update"}, @matching_prepared=true, @significant_keys=[:id, :format, :controller, :action], @segments=[#<ActionController::Routing::DividerSegment:0xb76d6ebc @value="/", @is_optional=false, @raw=true>, #<ActionController::Routing::StaticSegment:0xb76d6e1c @value="line_items", @is_optional=false>, #<ActionController::Routing::DividerSegment:0xb76d6d68 @value="/", @is_optional=false, @raw=true>, #<ActionController::Routing::DynamicSegment:0xb76d6cc8 @is_optional=false, @regexp=/[^\/.?]+/, @key=:id>, #<ActionController::Routing::OptionalFormatSegment:0xb76d6c50 @is_optional=true, @key=:format>], @to_s="PUT    /line_items/:id(.:format)?               {:controller=>\"line_items\", :action=>\"update\"}", @optimise=false, @parameter_shell={:controller=>"line_items", :action=>"update"}, @conditions={:method=>:put}, @requirements={:controller=>"line_items", :action=>"update"}, @action_requirement="update">, #<ActionController::Routing::Route:0xb76d3668 @controller_requirement="line_items", @defaults={:controller=>"line_items", :action=>"destroy"}, @matching_prepared=true, @significant_keys=[:id, :format, :controller, :action], @segments=[#<ActionController::Routing::DividerSegment:0xb76d3e10 @value="/", @is_optional=false, @raw=true>, #<ActionController::Routing::StaticSegment:0xb76d3d70 @value="line_items", @is_optional=false>, #<ActionController::Routing::DividerSegment:0xb76d3cbc @value="/", @is_optional=false, @raw=true>, #<ActionController::Routing::DynamicSegment:0xb76d3c1c @is_optional=false, @regexp=/[^\/.?]+/, @key=:id>, #<ActionController::Routing::OptionalFormatSegment:0xb76d3ba4 @is_optional=true, @key=:format>], @to_s="DELETE /line_items/:id(.:format)?               {:controller=>\"line_items\", :action=>\"destroy\"}", @optimise=false, @parameter_shell={:controller=>"line_items", :action=>"destroy"}, @conditions={:method=>:delete}, @requirements={:controller=>"line_items", :action=>"destroy"}, @action_requirement="destroy">, #<ActionController::Routing::Route:0xb76d0454 @controller_requirement="orders", @defaults={:controller=>"orders", :action=>"index"}, @matching_prepared=true, @significant_keys=[:format, :controller, :action], @segments=[#<ActionController::Routing::DividerSegment:0xb76d092c @value="/", @is_optional=false, @raw=true>, #<ActionController::Routing::StaticSegment:0xb76d088c @value="orders", @is_optional=false>, #<ActionController::Routing::OptionalFormatSegment:0xb76d0814 @is_optional=true, @key=:format>], @to_s="GET    /orders(.:format)?                       {:controller=>\"orders\", :action=>\"index\"}", @optimise=true, @parameter_shell={:controller=>"orders", :action=>"index"}, @conditions={:method=>:get}, @requirements={:controller=>"orders", :action=>"index"}, @action_requirement="index">, #<ActionController::Routing::Route:0xb76c77b4 @controller_requirement="orders", @defaults={:controller=>"orders", :action=>"create"}, @matching_prepared=true, @significant_keys=[:format, :controller, :action], @segments=[#<ActionController::Routing::DividerSegment:0xb76c7c8c @value="/", @is_optional=false, @raw=true>, #<ActionController::Routing::StaticSegment:0xb76c7bec @value="orders", @is_optional=false>, #<ActionController::Routing::OptionalFormatSegment:0xb76c7b74 @is_optional=true, @key=:format>], @to_s="POST   /orders(.:format)?                       {:controller=>\"orders\", :action=>\"create\"}", @optimise=true, @parameter_shell={:controller=>"orders", :action=>"create"}, @conditions={:method=>:post}, @requirements={:controller=>"orders", :action=>"create"}, @action_requirement="create">, #<ActionController::Routing::Route:0xb76c5374 @controller_requirement="orders", @defaults={:controller=>"orders", :action=>"new"}, @matching_prepared=true, @significant_keys=[:format, :controller, :action], @segments=[#<ActionController::Routing::DividerSegment:0xb76c59f0 @value="/", @is_optional=false, @raw=true>, #<ActionController::Routing::StaticSegment:0xb76c5950 @value="orders", @is_optional=false>, #<ActionController::Routing::DividerSegment:0xb76c589c @value="/", @is_optional=false, @raw=true>, #<ActionController::Routing::StaticSegment:0xb76c57fc @value="new", @is_optional=false>, #<ActionController::Routing::OptionalFormatSegment:0xb76c5784 @is_optional=true, @key=:format>], @to_s="GET    /orders/new(.:format)?                   {:controller=>\"orders\", :action=>\"new\"}", @optimise=true, @parameter_shell={:controller=>"orders", :action=>"new"}, @conditions={:method=>:get}, @requirements={:controller=>"orders", :action=>"new"}, @action_requirement="new">, #<ActionController::Routing::Route:0xb76bbf40 @controller_requirement="orders", @defaults={:controller=>"orders", :action=>"edit"}, @matching_prepared=true, @significant_keys=[:id, :format, :controller, :action], @segments=[#<ActionController::Routing::DividerSegment:0xb76bc88c @value="/", @is_optional=false, @raw=true>, #<ActionController::Routing::StaticSegment:0xb76bc7ec @value="orders", @is_optional=false>, #<ActionController::Routing::DividerSegment:0xb76bc738 @value="/", @is_optional=false, @raw=true>, #<ActionController::Routing::DynamicSegment:0xb76bc698 @is_optional=false, @regexp=/[^\/.?]+/, @key=:id>, #<ActionController::Routing::DividerSegment:0xb76bc5e4 @value="/", @is_optional=false, @raw=true>, #<ActionController::Routing::StaticSegment:0xb76bc544 @value="edit", @is_optional=false>, #<ActionController::Routing::OptionalFormatSegment:0xb76bc4cc @is_optional=true, @key=:format>], @to_s="GET    /orders/:id/edit(.:format)?              {:controller=>\"orders\", :action=>\"edit\"}", @optimise=false, @parameter_shell={:controller=>"orders", :action=>"edit"}, @conditions={:method=>:get}, @requirements={:controller=>"orders", :action=>"edit"}, @action_requirement="edit">, #<ActionController::Routing::Route:0xb76b6374 @controller_requirement="orders", @defaults={:controller=>"orders", :action=>"show"}, @matching_prepared=true, @significant_keys=[:id, :format, :controller, :action], @segments=[#<ActionController::Routing::DividerSegment:0xb76b6b1c @value="/", @is_optional=false, @raw=true>, #<ActionController::Routing::StaticSegment:0xb76b6a7c @value="orders", @is_optional=false>, #<ActionController::Routing::DividerSegment:0xb76b69c8 @value="/", @is_optional=false, @raw=true>, #<ActionController::Routing::DynamicSegment:0xb76b6928 @is_optional=false, @regexp=/[^\/.?]+/, @key=:id>, #<ActionController::Routing::OptionalFormatSegment:0xb76b68b0 @is_optional=true, @key=:format>], @to_s="GET    /orders/:id(.:format)?                   {:controller=>\"orders\", :action=>\"show\"}", @optimise=false, @parameter_shell={:controller=>"orders", :action=>"show"}, @conditions={:method=>:get}, @requirements={:controller=>"orders", :action=>"show"}, @action_requirement="show">, #<ActionController::Routing::Route:0xb76b0898 @controller_requirement="orders", @defaults={:controller=>"orders", :action=>"update"}, @matching_prepared=true, @significant_keys=[:id, :format, :controller, :action], @segments=[#<ActionController::Routing::DividerSegment:0xb76b1040 @value="/", @is_optional=false, @raw=true>, #<ActionController::Routing::StaticSegment:0xb76b0fa0 @value="orders", @is_optional=false>, #<ActionController::Routing::DividerSegment:0xb76b0eec @value="/", @is_optional=false, @raw=true>, #<ActionController::Routing::DynamicSegment:0xb76b0e4c @is_optional=false, @regexp=/[^\/.?]+/, @key=:id>, #<ActionController::Routing::OptionalFormatSegment:0xb76b0dd4 @is_optional=true, @key=:format>], @to_s="PUT    /orders/:id(.:format)?                   {:controller=>\"orders\", :action=>\"update\"}", @optimise=false, @parameter_shell={:controller=>"orders", :action=>"update"}, @conditions={:method=>:put}, @requirements={:controller=>"orders", :action=>"update"}, @action_requirement="update">, #<ActionController::Routing::Route:0xb76ad7ec @controller_requirement="orders", @defaults={:controller=>"orders", :action=>"destroy"}, @matching_prepared=true, @significant_keys=[:id, :format, :controller, :action], @segments=[#<ActionController::Routing::DividerSegment:0xb76adf94 @value="/", @is_optional=false, @raw=true>, #<ActionController::Routing::StaticSegment:0xb76adef4 @value="orders", @is_optional=false>, #<ActionController::Routing::DividerSegment:0xb76ade40 @value="/", @is_optional=false, @raw=true>, #<ActionController::Routing::DynamicSegment:0xb76adda0 @is_optional=false, @regexp=/[^\/.?]+/, @key=:id>, #<ActionController::Routing::OptionalFormatSegment:0xb76add28 @is_optional=true, @key=:format>], @to_s="DELETE /orders/:id(.:format)?                   {:controller=>\"orders\", :action=>\"destroy\"}", @optimise=false, @parameter_shell={:controller=>"orders", :action=>"destroy"}, @conditions={:method=>:delete}, @requirements={:controller=>"orders", :action=>"destroy"}, @action_requirement="destroy">, #<ActionController::Routing::Route:0xb76aa5d8 @controller_requirement="products", @defaults={:controller=>"products", :action=>"index"}, @matching_prepared=true, @significant_keys=[:format, :controller, :action], @segments=[#<ActionController::Routing::DividerSegment:0xb76aaab0 @value="/", @is_optional=false, @raw=true>, #<ActionController::Routing::StaticSegment:0xb76aaa10 @value="products", @is_optional=false>, #<ActionController::Routing::OptionalFormatSegment:0xb76aa998 @is_optional=true, @key=:format>], @to_s="GET    /products(.:format)?                     {:controller=>\"products\", :action=>\"index\"}", @optimise=true, @parameter_shell={:controller=>"products", :action=>"index"}, @conditions={:method=>:get}, @requirements={:controller=>"products", :action=>"index"}, @action_requirement="index">, #<ActionController::Routing::Route:0xb76a1938 @controller_requirement="products", @defaults={:controller=>"products", :action=>"create"}, @matching_prepared=true, @significant_keys=[:format, :controller, :action], @segments=[#<ActionController::Routing::DividerSegment:0xb76a1e10 @value="/", @is_optional=false, @raw=true>, #<ActionController::Routing::StaticSegment:0xb76a1d70 @value="products", @is_optional=false>, #<ActionController::Routing::OptionalFormatSegment:0xb76a1cf8 @is_optional=true, @key=:format>], @to_s="POST   /products(.:format)?                     {:controller=>\"products\", :action=>\"create\"}", @optimise=true, @parameter_shell={:controller=>"products", :action=>"create"}, @conditions={:method=>:post}, @requirements={:controller=>"products", :action=>"create"}, @action_requirement="create">, #<ActionController::Routing::Route:0xb769f4f8 @controller_requirement="products", @defaults={:controller=>"products", :action=>"new"}, @matching_prepared=true, @significant_keys=[:format, :controller, :action], @segments=[#<ActionController::Routing::DividerSegment:0xb769fb74 @value="/", @is_optional=false, @raw=true>, #<ActionController::Routing::StaticSegment:0xb769fad4 @value="products", @is_optional=false>, #<ActionController::Routing::DividerSegment:0xb769fa20 @value="/", @is_optional=false, @raw=true>, #<ActionController::Routing::StaticSegment:0xb769f980 @value="new", @is_optional=false>, #<ActionController::Routing::OptionalFormatSegment:0xb769f908 @is_optional=true, @key=:format>], @to_s="GET    /products/new(.:format)?                 {:controller=>\"products\", :action=>\"new\"}", @optimise=true, @parameter_shell={:controller=>"products", :action=>"new"}, @conditions={:method=>:get}, @requirements={:controller=>"products", :action=>"new"}, @action_requirement="new">, #<ActionController::Routing::Route:0xb76960c4 @controller_requirement="products", @defaults={:controller=>"products", :action=>"edit"}, @matching_prepared=true, @significant_keys=[:id, :format, :controller, :action], @segments=[#<ActionController::Routing::DividerSegment:0xb7696a10 @value="/", @is_optional=false, @raw=true>, #<ActionController::Routing::StaticSegment:0xb7696970 @value="products", @is_optional=false>, #<ActionController::Routing::DividerSegment:0xb76968bc @value="/", @is_optional=false, @raw=true>, #<ActionController::Routing::DynamicSegment:0xb769681c @is_optional=false, @regexp=/[^\/.?]+/, @key=:id>, #<ActionController::Routing::DividerSegment:0xb7696768 @value="/", @is_optional=false, @raw=true>, #<ActionController::Routing::StaticSegment:0xb76966c8 @value="edit", @is_optional=false>, #<ActionController::Routing::OptionalFormatSegment:0xb7696650 @is_optional=true, @key=:format>], @to_s="GET    /products/:id/edit(.:format)?            {:controller=>\"products\", :action=>\"edit\"}", @optimise=false, @parameter_shell={:controller=>"products", :action=>"edit"}, @conditions={:method=>:get}, @requirements={:controller=>"products", :action=>"edit"}, @action_requirement="edit">, #<ActionController::Routing::Route:0xb76904f8 @controller_requirement="products", @defaults={:controller=>"products", :action=>"show"}, @matching_prepared=true, @significant_keys=[:id, :format, :controller, :action], @segments=[#<ActionController::Routing::DividerSegment:0xb7690ca0 @value="/", @is_optional=false, @raw=true>, #<ActionController::Routing::StaticSegment:0xb7690c00 @value="products", @is_optional=false>, #<ActionController::Routing::DividerSegment:0xb7690b4c @value="/", @is_optional=false, @raw=true>, #<ActionController::Routing::DynamicSegment:0xb7690aac @is_optional=false, @regexp=/[^\/.?]+/, @key=:id>, #<ActionController::Routing::OptionalFormatSegment:0xb7690a34 @is_optional=true, @key=:format>], @to_s="GET    /products/:id(.:format)?                 {:controller=>\"products\", :action=>\"show\"}", @optimise=false, @parameter_shell={:controller=>"products", :action=>"show"}, @conditions={:method=>:get}, @requirements={:controller=>"products", :action=>"show"}, @action_requirement="show">, #<ActionController::Routing::Route:0xb768aa1c @controller_requirement="products", @defaults={:controller=>"products", :action=>"update"}, @matching_prepared=true, @significant_keys=[:id, :format, :controller, :action], @segments=[#<ActionController::Routing::DividerSegment:0xb768b1c4 @value="/", @is_optional=false, @raw=true>, #<ActionController::Routing::StaticSegment:0xb768b124 @value="products", @is_optional=false>, #<ActionController::Routing::DividerSegment:0xb768b070 @value="/", @is_optional=false, @raw=true>, #<ActionController::Routing::DynamicSegment:0xb768afd0 @is_optional=false, @regexp=/[^\/.?]+/, @key=:id>, #<ActionController::Routing::OptionalFormatSegment:0xb768af58 @is_optional=true, @key=:format>], @to_s="PUT    /products/:id(.:format)?                 {:controller=>\"products\", :action=>\"update\"}", @optimise=false, @parameter_shell={:controller=>"products", :action=>"update"}, @conditions={:method=>:put}, @requirements={:controller=>"products", :action=>"update"}, @action_requirement="update">, #<ActionController::Routing::Route:0xb7687970 @controller_requirement="products", @defaults={:controller=>"products", :action=>"destroy"}, @matching_prepared=true, @significant_keys=[:id, :format, :controller, :action], @segments=[#<ActionController::Routing::DividerSegment:0xb7688118 @value="/", @is_optional=false, @raw=true>, #<ActionController::Routing::StaticSegment:0xb7688078 @value="products", @is_optional=false>, #<ActionController::Routing::DividerSegment:0xb7687fc4 @value="/", @is_optional=false, @raw=true>, #<ActionController::Routing::DynamicSegment:0xb7687f24 @is_optional=false, @regexp=/[^\/.?]+/, @key=:id>, #<ActionController::Routing::OptionalFormatSegment:0xb7687eac @is_optional=true, @key=:format>], @to_s="DELETE /products/:id(.:format)?                 {:controller=>\"products\", :action=>\"destroy\"}", @optimise=false, @parameter_shell={:controller=>"products", :action=>"destroy"}, @conditions={:method=>:delete}, @requirements={:controller=>"products", :action=>"destroy"}, @action_requirement="destroy">, #<ActionController::Routing::Route:0xb7684ba8 @controller_requirement=nil, @defaults={:action=>"index"}, @matching_prepared=true, @significant_keys=[:controller, :action, :id], @segments=[#<ActionController::Routing::DividerSegment:0xb7685120 @value="/", @is_optional=false, @raw=true>, #<ActionController::Routing::ControllerSegment:0xb7685080 @is_optional=false, @key=:controller>, #<ActionController::Routing::DividerSegment:0xb7684fcc @value="/", @is_optional=true, @raw=true>, #<ActionController::Routing::DynamicSegment:0xb7684f2c @is_optional=true, @default="index", @key=:action>, #<ActionController::Routing::DividerSegment:0xb7684e78 @value="/", @is_optional=true, @raw=true>, #<ActionController::Routing::DynamicSegment:0xb7684dd8 @is_optional=true, @key=:id>, #<ActionController::Routing::DividerSegment:0xb7684d24 @value="/", @is_optional=true, @raw=true>], @to_s="ANY    /:controller/:action/:id/                {}", @optimise=false, @parameter_shell={}, @conditions={}, @requirements={}, @action_requirement=nil>, #<ActionController::Routing::Route:0xb7681728 @controller_requirement=nil, @defaults={:action=>"index"}, @matching_prepared=true, @significant_keys=[:controller, :action, :id, :format], @segments=[#<ActionController::Routing::DividerSegment:0xb7681c78 @value="/", @is_optional=false, @raw=true>, #<ActionController::Routing::ControllerSegment:0xb7681bd8 @is_optional=false, @key=:controller>, #<ActionController::Routing::DividerSegment:0xb7681b24 @value="/", @is_optional=true, @raw=true>, #<ActionController::Routing::DynamicSegment:0xb7681a84 @is_optional=true, @default="index", @key=:action>, #<ActionController::Routing::DividerSegment:0xb76819d0 @value="/", @is_optional=true, @raw=true>, #<ActionController::Routing::DynamicSegment:0xb7681930 @is_optional=true, @key=:id>, #<ActionController::Routing::OptionalFormatSegment:0xb76818b8 @is_optional=true, @key=:format>], @to_s="ANY    /:controller/:action/:id(.:format)?      {}", @optimise=false, @parameter_shell={}, @conditions={}, @requirements={}, @action_requirement=nil>]> 
    >> app = ActionController::Integration::Session.new 
    => #<ActionController::Integration::Session:0xb766cd3c @host="www.example.com", @request=nil, @status_message=nil, @named_routes_configured=true, @accept="text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5", @controller=nil, @result=nil, @remote_addr="127.0.0.1", @request_count=0, @application=#<ActionController::Dispatcher:0xb7663bd8 @output=#<IO:0xb7d28568>, @app=#<Rack::Lock:0xb7659930 @lock=#<Mutex:0xb765987c>, @app=#<ActionController::Failsafe:0xb7659a0c @app=#<ActionController::RewindableInput:0xb7659ae8 @app=#<ActionController::ParamsParser:0xb7659bc4 @app=#<Rack::MethodOverride:0xb7659ca0 @app=#<Rack::Head:0xb7659e44 @app=#<Proc:0xb766aca8@/usr/lib/ruby/gems/1.8/gems/actionpack-2.3.2/lib/action_controller/dispatcher.rb:82>>>>>>>>, @cookies={}, @headers=nil, @response=nil, @path=nil, @https=false, @status=nil> 
      
    >> puts rs.routes 
    GET    /users(.:format)?                        {:controller=>"users", :action=>"index"} 
    POST   /users(.:format)?                        {:controller=>"users", :action=>"create"} 
    GET    /users/new(.:format)?                    {:controller=>"users", :action=>"new"} 
    GET    /users/:id/edit(.:format)?               {:controller=>"users", :action=>"edit"} 
    GET    /users/:id(.:format)?                    {:controller=>"users", :action=>"show"} 
    PUT    /users/:id(.:format)?                    {:controller=>"users", :action=>"update"} 
    DELETE /users/:id(.:format)?                    {:controller=>"users", :action=>"destroy"} 
    GET    /line_items(.:format)?                   {:controller=>"line_items", :action=>"index"} 
    POST   /line_items(.:format)?                   {:controller=>"line_items", :action=>"create"} 
    GET    /line_items/new(.:format)?               {:controller=>"line_items", :action=>"new"} 
    GET    /line_items/:id/edit(.:format)?          {:controller=>"line_items", :action=>"edit"} 
    GET    /line_items/:id(.:format)?               {:controller=>"line_items", :action=>"show"} 
    PUT    /line_items/:id(.:format)?               {:controller=>"line_items", :action=>"update"} 
    DELETE /line_items/:id(.:format)?               {:controller=>"line_items", :action=>"destroy"} 
    GET    /orders(.:format)?                       {:controller=>"orders", :action=>"index"} 
    POST   /orders(.:format)?                       {:controller=>"orders", :action=>"create"} 
    GET    /orders/new(.:format)?                   {:controller=>"orders", :action=>"new"} 
    GET    /orders/:id/edit(.:format)?              {:controller=>"orders", :action=>"edit"} 
    GET    /orders/:id(.:format)?                   {:controller=>"orders", :action=>"show"} 
    PUT    /orders/:id(.:format)?                   {:controller=>"orders", :action=>"update"} 
    DELETE /orders/:id(.:format)?                   {:controller=>"orders", :action=>"destroy"} 
    GET    /products(.:format)?                     {:controller=>"products", :action=>"index"} 
    POST   /products(.:format)?                     {:controller=>"products", :action=>"create"} 
    GET    /products/new(.:format)?                 {:controller=>"products", :action=>"new"} 
    GET    /products/:id/edit(.:format)?            {:controller=>"products", :action=>"edit"} 
    GET    /products/:id(.:format)?                 {:controller=>"products", :action=>"show"} 
    PUT    /products/:id(.:format)?                 {:controller=>"products", :action=>"update"} 
    DELETE /products/:id(.:format)?                 {:controller=>"products", :action=>"destroy"} 
    ANY    /:controller/:action/:id/                {} 
    ANY    /:controller/:action/:id(.:format)?      {} 
    => nil 
    >> rs.recognize_path "/store" 
    => {:controller=>"store", :action=>"index"} 
    >> rs.recognize_path "/store/add_to_cart/1" 
    => {:controller=>"store", :action=>"add_to_cart", :id=>"1"} 
    >> rs.recognize_path "/store/add_to_cart/1.xml" 
    => {:controller=>"store", :format=>"xml", :action=>"add_to_cart", :id=>"1"} 
    >> rs.generate :controller => :store 
    => "/store" 
    >> rs.generate :controller => :store, :id => 123 
    => "/store/index/123" 
    >> rs.recognize_path "/coupon/show/1" 
    => {:controller=>"coupon", :action=>"show", :id=>"1"} 
    >> load "config/routes.rb" 
    => [] 
    >> rs.recognize_path "/coupon/show/1" 
    => {:controller=>"coupon", :action=>"show", :id=>"1"} 
    >> app.url_for :controller => :store, :action => :display, :id => 123 
    => "http://www.example.com/store/display/123" 
      
    irb e1/routing/config/routes_for_blog.rb 
    >> require 'activesupport' 
    => true 
    >> require 'action_controller' 
    => ["Mime", "HTML", "ActionController"] 
    >> require 'action_controller/integration' 
    => [] 
      
    >> ActionController::Base.session_store = nil 
    => nil 
    >> ActionController::Routing.use_controllers! [ "article", "blog" ] 
    => ["article", "blog"] 
    >> rs = ActionController::Routing::Routes 
    => #<ActionController::Routing::RouteSet:0xb7625748 @configuration_files=[], @named_routes=#<ActionController::Routing::RouteSet::NamedRouteCollection:0xb761fb40 @module=#<Module:0xb761fadc>, @helpers=[], @routes={}>, @routes=[]> 
    >> app = ActionController::Integration::Session.new 
    => #<ActionController::Integration::Session:0xb761add4 @host="www.example.com", @request=nil, @status_message=nil, @named_routes_configured=true, @accept="text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5", @controller=nil, @result=nil, @remote_addr="127.0.0.1", @request_count=0, @application=#<ActionController::Dispatcher:0xb7611c70 @output=#<IO:0xb7c21570>, @app=#<Rack::Lock:0xb76079c8 @lock=#<Mutex:0xb7607914>, @app=#<ActionController::Failsafe:0xb7607aa4 @app=#<ActionController::RewindableInput:0xb7607b80 @app=#<ActionController::ParamsParser:0xb7607c5c @app=#<Rack::MethodOverride:0xb7607d38 @app=#<Rack::Head:0xb7607edc @app=#<Proc:0xb7618d40@/usr/lib/ruby/gems/1.8/gems/actionpack-2.3.2/lib/action_controller/dispatcher.rb:82>>>>>>>>, @cookies={}, @headers=nil, @response=nil, @path=nil, @https=false, @status=nil> 
      
    ?> ActionController::Routing::Routes.draw do |map|  
      
    ?>   # Straight 'http://my.app/blog/' displays the index  
    ?>   map.connect "blog/",  
    ?>               :controller => "blog",  
    ?>               :action => "index"  
      
    ?>   # Return articles for a year, year/month, or year/month/day  
    ?>   map.connect "blog/:year/:month/:day",  
    ?>               :controller => "blog",  
    ?>               :action => "show_date",  
    ?>               :requirements => { :year => /(19|20)\d\d/, 
    ?>                                  :month => /[01]?\d/,  
    ?>                                  :day => /[0-3]?\d/},  
    ?>               :day => nil,  
    ?>               :month => nil  
      
    >>   # Show an article identified by an id  
    ?>   map.connect "blog/show/:id",  
    ?>               :controller => "blog",  
    ?>               :action => "show",  
    ?>               :id => /\d+/  
      
    >>   # Regular Rails routing for admin stuff  
    ?>   map.connect "blog/:controller/:action/:id"  
      
    >>   # Catchall so we can gracefully handle badly formed requests  
    ?>   map.connect "*anything",  
    ?>               :controller => "blog",  
    ?>               :action => "unknown_request"  
    >> end 
    => [ActionController::Base, ActionView::Base] 
      
    >> rs.recognize_path "/blog" 
    => {:controller=>"blog", :action=>"index"} 
    >> rs.recognize_path "/blog/show/123" 
    => {:controller=>"blog", :action=>"show", :id=>"123"} 
    >> rs.recognize_path "/blog/2004" 
    => {:year=>"2004", :controller=>"blog", :action=>"show_date"} 
    >> rs.recognize_path "/blog/2004/12" 
    => {:month=>"12", :year=>"2004", :controller=>"blog", :action=>"show_date"} 
    >> rs.recognize_path "/blog/2004/12/25" 
    => {:month=>"12", :year=>"2004", :controller=>"blog", :action=>"show_date", :day=>"25"} 
    >> rs.recognize_path "/blog/article/edit/123" 
    => {:controller=>"article", :action=>"edit", :id=>"123"} 
    >> rs.recognize_path "/blog/article/show_stats" 
    => {:controller=>"article", :action=>"show_stats"} 
    >> rs.recognize_path "/blog/wibble" 
    => {:controller=>"blog", :anything=>["blog", "wibble"], :action=>"unknown_request"} 
    >> rs.recognize_path "/junk" 
    => {:controller=>"blog", :anything=>["junk"], :action=>"unknown_request"} 
      
    >> last_request = rs.recognize_path "/blog/2006/07/28" 
    => {:month=>"07", :year=>"2006", :controller=>"blog", :action=>"show_date", :day=>"28"} 
    >> rs.generate({:day => 25}, last_request) 
    => "/blog/2006/07/25" 
    >> rs.generate({:year => 2005}, last_request) 
    => "/blog/2005" 
    >> rs.generate({:action => "show" , :id => 123}, last_request) 
    => "/blog/show/123" 
    >> rs.generate({:year => 2006}, last_request) 
    => "/blog/2006/07/28" 
    >> rs.generate({:year => 2006, :month => nil}, last_request) 
    => "/blog/2006" 
      
    >> app.url_for :controller => 'blog', :action => 'show_date', :year => 2002 
    => "http://www.example.com/blog/2002" 
    >> app.url_for :controller => 'blog', :action => 'show_date', :overwrite_params => {:year => "2002" } 
    => "http://www.example.com/blog/2002" 
      
    
      23.3 Helpers for Formatting, Linking, and Pagination 
     
    ruby /home/rubys/git/rails/railties/bin/rails view 
          create   
          create  app/controllers 
          create  app/helpers 
          create  app/models 
          create  app/views/layouts 
          create  config/environments 
          create  config/initializers 
          create  config/locales 
          create  db 
          create  doc 
          create  lib 
          create  lib/tasks 
          create  log 
          create  public/images 
          create  public/javascripts 
          create  public/stylesheets 
          create  script/performance 
          create  test/fixtures 
          create  test/functional 
          create  test/integration 
          create  test/performance 
          create  test/unit 
          create  vendor 
          create  vendor/plugins 
          create  tmp/sessions 
          create  tmp/sockets 
          create  tmp/cache 
          create  tmp/pids 
          create  Rakefile 
          create  README 
          create  app/controllers/application_controller.rb 
          create  app/helpers/application_helper.rb 
          create  config/database.yml 
          create  config/routes.rb 
          create  config/locales/en.yml 
          create  db/seeds.rb 
          create  config/initializers/backtrace_silencers.rb 
          create  config/initializers/inflections.rb 
          create  config/initializers/mime_types.rb 
          create  config/initializers/new_rails_defaults.rb 
          create  config/initializers/session_store.rb 
          create  config/environment.rb 
          create  config/boot.rb 
          create  config/environments/production.rb 
          create  config/environments/development.rb 
          create  config/environments/test.rb 
          create  script/about 
          create  script/console 
          create  script/dbconsole 
          create  script/destroy 
          create  script/generate 
          create  script/runner 
          create  script/server 
          create  script/plugin 
          create  script/performance/benchmarker 
          create  script/performance/profiler 
          create  test/test_helper.rb 
          create  test/performance/browsing_test.rb 
          create  public/404.html 
          create  public/422.html 
          create  public/500.html 
          create  public/index.html 
          create  public/favicon.ico 
          create  public/robots.txt 
          create  public/images/rails.png 
          create  public/javascripts/prototype.js 
          create  public/javascripts/effects.js 
          create  public/javascripts/dragdrop.js 
          create  public/javascripts/controls.js 
          create  public/javascripts/application.js 
          create  doc/README_FOR_APP 
          create  log/server.log 
          create  log/production.log 
          create  log/development.log 
          create  log/test.log 
    ln -s /home/rubys/git/rails vendor/rails 
    cp -v /home/rubys/git/awdwr/data/code/e1/views/app/controllers/*.rb app/controllers 
    `/home/rubys/git/awdwr/data/code/e1/views/app/controllers/array_controller.rb' -> `app/controllers/array_controller.rb' 
    `/home/rubys/git/awdwr/data/code/e1/views/app/controllers/blog1_controller.rb' -> `app/controllers/blog1_controller.rb' 
    `/home/rubys/git/awdwr/data/code/e1/views/app/controllers/blog2_controller.rb' -> `app/controllers/blog2_controller.rb' 
    `/home/rubys/git/awdwr/data/code/e1/views/app/controllers/blog_controller.rb' -> `app/controllers/blog_controller.rb' 
    `/home/rubys/git/awdwr/data/code/e1/views/app/controllers/builder_controller.rb' -> `app/controllers/builder_controller.rb' 
    `/home/rubys/git/awdwr/data/code/e1/views/app/controllers/form_controller.rb' -> `app/controllers/form_controller.rb' 
    `/home/rubys/git/awdwr/data/code/e1/views/app/controllers/form_for_controller.rb' -> `app/controllers/form_for_controller.rb' 
    `/home/rubys/git/awdwr/data/code/e1/views/app/controllers/pager_controller.rb' -> `app/controllers/pager_controller.rb' 
    `/home/rubys/git/awdwr/data/code/e1/views/app/controllers/partial_controller.rb' -> `app/controllers/partial_controller.rb' 
    `/home/rubys/git/awdwr/data/code/e1/views/app/controllers/products_controller.rb' -> `app/controllers/products_controller.rb' 
    `/home/rubys/git/awdwr/data/code/e1/views/app/controllers/rhtml_controller.rb' -> `app/controllers/rhtml_controller.rb' 
    `/home/rubys/git/awdwr/data/code/e1/views/app/controllers/test_controller.rb' -> `app/controllers/test_controller.rb' 
    `/home/rubys/git/awdwr/data/code/e1/views/app/controllers/upload_controller.rb' -> `app/controllers/upload_controller.rb' 
    cp -vr /home/rubys/git/awdwr/data/code/e1/views/app/views/pager app/views 
    `/home/rubys/git/awdwr/data/code/e1/views/app/views/pager' -> `app/views/pager' 
    `/home/rubys/git/awdwr/data/code/e1/views/app/views/pager/user_list.html.erb' -> `app/views/pager/user_list.html.erb' 
    `/home/rubys/git/awdwr/data/code/e1/views/app/views/pager/user_list.erb' -> `app/views/pager/user_list.erb' 
    ruby script/generate model user name:string 
          exists  app/models/ 
          exists  test/unit/ 
          exists  test/fixtures/ 
          create  app/models/user.rb 
          create  test/unit/user_test.rb 
          create  test/fixtures/users.yml 
          create  db/migrate 
          create  db/migrate/20090518123709_create_users.rb 
    restart 
    rake db:migrate 
    mv 20090518123709_create_users.rb 20080601000001_create_users.rb 
    (in /home/rubys/git/awdwr/work/view) 
    ==  CreateUsers: migrating ==================================================== 
    -- create_table(:users) 
       -> 0.0012s 
    ==  CreateUsers: migrated (0.0013s) =========================================== 
      
    echo "PagerController.new.populate" | ruby script/console 
    >> PagerController.new.populate 
    => 763 
    >>  
    get /pager/user_list 
    
  Name  
  
    Adam Keys  
  
    Andy Hunt  
  
    Brian Marick  
  
    Brian McCallister  
  
    Chad Fowler  
  
    Chris Pine  
  
    Daniel Berger  
  
    Dave Thomas  
  
    David Heinemeier Hansson  
  
    Eric Hodel  
  
    Esther Derby  
  
    Greg Wilson  
  
    James Gray  
  
    Jeffrey Fredrick  
  
    Johanna Rothman  
  
    Juliet Thomas  
  
    Maik Schmidt  
  
    Marcel Molina  
  
    Mike Clark  
  
    Mike Gunderloy  
  
    Mike Mason  
  
    Ryan Davis  
  
    Scott Barron  
  
    Scott Davis  
  
    Thomas Fuchs  
  
    ZZUser 000  
  
    ZZUser 001  
  
    ZZUser 002  
  
    ZZUser 003  
  
    ZZUser 004  
  
 
 
     
    
    get /pager/user_list?page=2 
    
  Name  
  
    ZZUser 005  
  
    ZZUser 006  
  
    ZZUser 007  
  
    ZZUser 008  
  
    ZZUser 009  
  
    ZZUser 010  
  
    ZZUser 011  
  
    ZZUser 012  
  
    ZZUser 013  
  
    ZZUser 014  
  
    ZZUser 015  
  
    ZZUser 016  
  
    ZZUser 017  
  
    ZZUser 018  
  
    ZZUser 019  
  
    ZZUser 020  
  
    ZZUser 021  
  
    ZZUser 022  
  
    ZZUser 023  
  
    ZZUser 024  
  
    ZZUser 025  
  
    ZZUser 026  
  
    ZZUser 027  
  
    ZZUser 028  
  
    ZZUser 029  
  
    ZZUser 030  
  
    ZZUser 031  
  
    ZZUser 032  
  
    ZZUser 033  
  
    ZZUser 034  
  
 
 
     
    
    
      23.5 Forms That Wrap Model Objects 
     
    cp -rpv /home/rubys/git/awdwr/plugins/country_select vendor/plugins/ 
    `/home/rubys/git/awdwr/plugins/country_select' -> `vendor/plugins/country_select' 
    `/home/rubys/git/awdwr/plugins/country_select/lib' -> `vendor/plugins/country_select/lib' 
    `/home/rubys/git/awdwr/plugins/country_select/lib/country_select.rb' -> `vendor/plugins/country_select/lib/country_select.rb' 
    `/home/rubys/git/awdwr/plugins/country_select/MIT-LICENSE' -> `vendor/plugins/country_select/MIT-LICENSE' 
    `/home/rubys/git/awdwr/plugins/country_select/init.rb' -> `vendor/plugins/country_select/init.rb' 
    `/home/rubys/git/awdwr/plugins/country_select/uninstall.rb' -> `vendor/plugins/country_select/uninstall.rb' 
    `/home/rubys/git/awdwr/plugins/country_select/install.rb' -> `vendor/plugins/country_select/install.rb' 
    `/home/rubys/git/awdwr/plugins/country_select/README' -> `vendor/plugins/country_select/README' 
    restart 
    ruby script/generate model product title:string description:text image_url:string price:decimal 
          exists  app/models/ 
          exists  test/unit/ 
          exists  test/fixtures/ 
          create  app/models/product.rb 
          create  test/unit/product_test.rb 
          create  test/fixtures/products.yml 
          exists  db/migrate 
          create  db/migrate/20090518123739_create_products.rb 
    cp -v /home/rubys/git/awdwr/data/code/e1/views/db/migrate/*products.rb db/migrate/*products.rb 
    `/home/rubys/git/awdwr/data/code/e1/views/db/migrate/002_create_products.rb' -> `db/migrate/20090518123739_create_products.rb' 
    cp -v /home/rubys/git/awdwr/data/code/e1/views/app/models/shipping.rb app/models 
    `/home/rubys/git/awdwr/data/code/e1/views/app/models/shipping.rb' -> `app/models/shipping.rb' 
    ruby script/generate model detail product_id:integer sku:string manufacturer:string 
          exists  app/models/ 
          exists  test/unit/ 
          exists  test/fixtures/ 
          create  app/models/detail.rb 
          create  test/unit/detail_test.rb 
          create  test/fixtures/details.yml 
          exists  db/migrate 
          create  db/migrate/20090518123741_create_details.rb 
    cp -v /home/rubys/git/awdwr/data/code/e1/views/db/migrate/*details.rb db/migrate/*details.rb 
    `/home/rubys/git/awdwr/data/code/e1/views/db/migrate/004_create_details.rb' -> `db/migrate/20090518123741_create_details.rb' 
    cp -v /home/rubys/git/awdwr/data/code/e1/views/app/models/detail.rb app/models 
    `/home/rubys/git/awdwr/data/code/e1/views/app/models/detail.rb' -> `app/models/detail.rb' 
    rake db:migrate 
    mv 20090518123739_create_products.rb 20080601000002_create_products.rb 
    mv 20090518123741_create_details.rb 20080601000003_create_details.rb 
    (in /home/rubys/git/awdwr/work/view) 
    ==  CreateProducts: migrating ================================================= 
    -- create_table(:products) 
       -> 0.0017s 
    ==  CreateProducts: migrated (0.0018s) ======================================== 
      
    ==  CreateDetails: migrating ================================================== 
    -- create_table(:details) 
       -> 0.0014s 
    ==  CreateDetails: migrated (0.0015s) ========================================= 
      
    cp -vr /home/rubys/git/awdwr/data/code/e1/views/app/views/form_for app/views 
    `/home/rubys/git/awdwr/data/code/e1/views/app/views/form_for' -> `app/views/form_for' 
    `/home/rubys/git/awdwr/data/code/e1/views/app/views/form_for/new.html.erb' -> `app/views/form_for/new.html.erb' 
    `/home/rubys/git/awdwr/data/code/e1/views/app/views/form_for/create.html.erb' -> `app/views/form_for/create.html.erb' 
    get /form_for/new 
    
    
    cp -vr /home/rubys/git/awdwr/data/code/e1/views/app/views/test app/views 
    `/home/rubys/git/awdwr/data/code/e1/views/app/views/test' -> `app/views/test' 
    `/home/rubys/git/awdwr/data/code/e1/views/app/views/test/calculate.html.erb' -> `app/views/test/calculate.html.erb' 
    `/home/rubys/git/awdwr/data/code/e1/views/app/views/test/calc.html.erb' -> `app/views/test/calc.html.erb' 
    `/home/rubys/git/awdwr/data/code/e1/views/app/views/test/example1.reval' -> `app/views/test/example1.reval' 
    `/home/rubys/git/awdwr/data/code/e1/views/app/views/test/numbers.xml.builder' -> `app/views/test/numbers.xml.builder' 
    `/home/rubys/git/awdwr/data/code/e1/views/app/views/test/objects.xml.builder' -> `app/views/test/objects.xml.builder' 
    `/home/rubys/git/awdwr/data/code/e1/views/app/views/test/date_dump.html.erb' -> `app/views/test/date_dump.html.erb' 
    `/home/rubys/git/awdwr/data/code/e1/views/app/views/test/date_tags.html.erb' -> `app/views/test/date_tags.html.erb' 
    `/home/rubys/git/awdwr/data/code/e1/views/app/views/test/test.html.erb' -> `app/views/test/test.html.erb' 
    `/home/rubys/git/awdwr/data/code/e1/views/app/views/test/date_format.reval' -> `app/views/test/date_format.reval' 
    `/home/rubys/git/awdwr/data/code/e1/views/app/views/test/dates.xml.builder' -> `app/views/test/dates.xml.builder' 
    `/home/rubys/git/awdwr/data/code/e1/views/app/views/test/text.xml.builder' -> `app/views/test/text.xml.builder' 
    `/home/rubys/git/awdwr/data/code/e1/views/app/views/test/t.html.erb' -> `app/views/test/t.html.erb' 
    `/home/rubys/git/awdwr/data/code/e1/views/app/views/test/select.html.erb' -> `app/views/test/select.html.erb' 
    `/home/rubys/git/awdwr/data/code/e1/views/app/views/test/example.rdoc' -> `app/views/test/example.rdoc' 
    get /test/select 
    
 
 
 
 
  Andy 
Bert 
Chas 
Dave 
Eric 
Fred  
 
 
 
 
 
 
Andy 
Bert 
Chas 
Dave 
Eric 
Fred  
 
 
Eric 
Andy 
Dave 
Chas 
Fred 
Bert  
 
Adam Keys 
Andy Hunt 
Brian Marick 
Brian McCallister 
Chad Fowler 
Chris Pine 
Daniel Berger 
Dave Thomas 
David Heinemeier Hansson 
Eric Hodel 
Esther Derby 
Greg Wilson 
James Gray 
Jeffrey Fredrick 
Johanna Rothman 
Juliet Thomas 
Maik Schmidt 
Marcel Molina 
Mike Clark 
Mike Gunderloy 
Mike Mason 
Ryan Davis 
Scott Barron 
Scott Davis 
Thomas Fuchs 
ZZUser 000 
ZZUser 001 
ZZUser 002 
ZZUser 003 
ZZUser 004 
ZZUser 005 
ZZUser 006 
ZZUser 007 
ZZUser 008 
ZZUser 009 
ZZUser 010 
ZZUser 011 
ZZUser 012 
ZZUser 013 
ZZUser 014 
ZZUser 015 
ZZUser 016 
ZZUser 017 
ZZUser 018 
ZZUser 019 
ZZUser 020 
ZZUser 021 
ZZUser 022 
ZZUser 023 
ZZUser 024 
ZZUser 025 
ZZUser 026 
ZZUser 027 
ZZUser 028 
ZZUser 029 
ZZUser 030 
ZZUser 031 
ZZUser 032 
ZZUser 033 
ZZUser 034 
ZZUser 035 
ZZUser 036 
ZZUser 037 
ZZUser 038 
ZZUser 039 
ZZUser 040 
ZZUser 041 
ZZUser 042 
ZZUser 043 
ZZUser 044 
ZZUser 045 
ZZUser 046 
ZZUser 047 
ZZUser 048 
ZZUser 049 
ZZUser 050 
ZZUser 051 
ZZUser 052 
ZZUser 053 
ZZUser 054 
ZZUser 055 
ZZUser 056 
ZZUser 057 
ZZUser 058 
ZZUser 059 
ZZUser 060 
ZZUser 061 
ZZUser 062 
ZZUser 063 
ZZUser 064 
ZZUser 065 
ZZUser 066 
ZZUser 067 
ZZUser 068 
ZZUser 069 
ZZUser 070 
ZZUser 071 
ZZUser 072 
ZZUser 073 
ZZUser 074 
ZZUser 075 
ZZUser 076 
ZZUser 077 
ZZUser 078 
ZZUser 079 
ZZUser 080 
ZZUser 081 
ZZUser 082 
ZZUser 083 
ZZUser 084 
ZZUser 085 
ZZUser 086 
ZZUser 087 
ZZUser 088 
ZZUser 089 
ZZUser 090 
ZZUser 091 
ZZUser 092 
ZZUser 093 
ZZUser 094 
ZZUser 095 
ZZUser 096 
ZZUser 097 
ZZUser 098 
ZZUser 099 
ZZUser 100 
ZZUser 101 
ZZUser 102 
ZZUser 103 
ZZUser 104 
ZZUser 105 
ZZUser 106 
ZZUser 107 
ZZUser 108 
ZZUser 109 
ZZUser 110 
ZZUser 111 
ZZUser 112 
ZZUser 113 
ZZUser 114 
ZZUser 115 
ZZUser 116 
ZZUser 117 
ZZUser 118 
ZZUser 119 
ZZUser 120 
ZZUser 121 
ZZUser 122 
ZZUser 123 
ZZUser 124 
ZZUser 125 
ZZUser 126 
ZZUser 127 
ZZUser 128 
ZZUser 129 
ZZUser 130 
ZZUser 131 
ZZUser 132 
ZZUser 133 
ZZUser 134 
ZZUser 135 
ZZUser 136 
ZZUser 137 
ZZUser 138 
ZZUser 139 
ZZUser 140 
ZZUser 141 
ZZUser 142 
ZZUser 143 
ZZUser 144 
ZZUser 145 
ZZUser 146 
ZZUser 147 
ZZUser 148 
ZZUser 149 
ZZUser 150 
ZZUser 151 
ZZUser 152 
ZZUser 153 
ZZUser 154 
ZZUser 155 
ZZUser 156 
ZZUser 157 
ZZUser 158 
ZZUser 159 
ZZUser 160 
ZZUser 161 
ZZUser 162 
ZZUser 163 
ZZUser 164 
ZZUser 165 
ZZUser 166 
ZZUser 167 
ZZUser 168 
ZZUser 169 
ZZUser 170 
ZZUser 171 
ZZUser 172 
ZZUser 173 
ZZUser 174 
ZZUser 175 
ZZUser 176 
ZZUser 177 
ZZUser 178 
ZZUser 179 
ZZUser 180 
ZZUser 181 
ZZUser 182 
ZZUser 183 
ZZUser 184 
ZZUser 185 
ZZUser 186 
ZZUser 187 
ZZUser 188 
ZZUser 189 
ZZUser 190 
ZZUser 191 
ZZUser 192 
ZZUser 193 
ZZUser 194 
ZZUser 195 
ZZUser 196 
ZZUser 197 
ZZUser 198 
ZZUser 199 
ZZUser 200 
ZZUser 201 
ZZUser 202 
ZZUser 203 
ZZUser 204 
ZZUser 205 
ZZUser 206 
ZZUser 207 
ZZUser 208 
ZZUser 209 
ZZUser 210 
ZZUser 211 
ZZUser 212 
ZZUser 213 
ZZUser 214 
ZZUser 215 
ZZUser 216 
ZZUser 217 
ZZUser 218 
ZZUser 219 
ZZUser 220 
ZZUser 221 
ZZUser 222 
ZZUser 223 
ZZUser 224 
ZZUser 225 
ZZUser 226 
ZZUser 227 
ZZUser 228 
ZZUser 229 
ZZUser 230 
ZZUser 231 
ZZUser 232 
ZZUser 233 
ZZUser 234 
ZZUser 235 
ZZUser 236 
ZZUser 237 
ZZUser 238 
ZZUser 239 
ZZUser 240 
ZZUser 241 
ZZUser 242 
ZZUser 243 
ZZUser 244 
ZZUser 245 
ZZUser 246 
ZZUser 247 
ZZUser 248 
ZZUser 249 
ZZUser 250 
ZZUser 251 
ZZUser 252 
ZZUser 253 
ZZUser 254 
ZZUser 255 
ZZUser 256 
ZZUser 257 
ZZUser 258 
ZZUser 259 
ZZUser 260 
ZZUser 261 
ZZUser 262 
ZZUser 263 
ZZUser 264 
ZZUser 265 
ZZUser 266 
ZZUser 267 
ZZUser 268 
ZZUser 269 
ZZUser 270 
ZZUser 271 
ZZUser 272 
ZZUser 273 
ZZUser 274 
ZZUser 275 
ZZUser 276 
ZZUser 277 
ZZUser 278 
ZZUser 279 
ZZUser 280 
ZZUser 281 
ZZUser 282 
ZZUser 283 
ZZUser 284 
ZZUser 285 
ZZUser 286 
ZZUser 287 
ZZUser 288 
ZZUser 289 
ZZUser 290 
ZZUser 291 
ZZUser 292 
ZZUser 293 
ZZUser 294 
ZZUser 295 
ZZUser 296 
ZZUser 297 
ZZUser 298 
ZZUser 299 
ZZUser 300 
ZZUser 301 
ZZUser 302 
ZZUser 303 
ZZUser 304 
ZZUser 305 
ZZUser 306 
ZZUser 307 
ZZUser 308 
ZZUser 309 
ZZUser 310 
ZZUser 311 
ZZUser 312 
ZZUser 313 
ZZUser 314 
ZZUser 315 
ZZUser 316 
ZZUser 317 
ZZUser 318 
ZZUser 319 
ZZUser 320 
ZZUser 321 
ZZUser 322 
ZZUser 323 
ZZUser 324 
ZZUser 325 
ZZUser 326 
ZZUser 327 
ZZUser 328 
ZZUser 329 
ZZUser 330 
ZZUser 331 
ZZUser 332 
ZZUser 333 
ZZUser 334 
ZZUser 335 
ZZUser 336 
ZZUser 337 
ZZUser 338 
ZZUser 339 
ZZUser 340 
ZZUser 341 
ZZUser 342 
ZZUser 343 
ZZUser 344 
ZZUser 345 
ZZUser 346 
ZZUser 347 
ZZUser 348 
ZZUser 349 
ZZUser 350 
ZZUser 351 
ZZUser 352 
ZZUser 353 
ZZUser 354 
ZZUser 355 
ZZUser 356 
ZZUser 357 
ZZUser 358 
ZZUser 359 
ZZUser 360 
ZZUser 361 
ZZUser 362 
ZZUser 363 
ZZUser 364 
ZZUser 365 
ZZUser 366 
ZZUser 367 
ZZUser 368 
ZZUser 369 
ZZUser 370 
ZZUser 371 
ZZUser 372 
ZZUser 373 
ZZUser 374 
ZZUser 375 
ZZUser 376 
ZZUser 377 
ZZUser 378 
ZZUser 379 
ZZUser 380 
ZZUser 381 
ZZUser 382 
ZZUser 383 
ZZUser 384 
ZZUser 385 
ZZUser 386 
ZZUser 387 
ZZUser 388 
ZZUser 389 
ZZUser 390 
ZZUser 391 
ZZUser 392 
ZZUser 393 
ZZUser 394 
ZZUser 395 
ZZUser 396 
ZZUser 397 
ZZUser 398 
ZZUser 399 
ZZUser 400 
ZZUser 401 
ZZUser 402 
ZZUser 403 
ZZUser 404 
ZZUser 405 
ZZUser 406 
ZZUser 407 
ZZUser 408 
ZZUser 409 
ZZUser 410 
ZZUser 411 
ZZUser 412 
ZZUser 413 
ZZUser 414 
ZZUser 415 
ZZUser 416 
ZZUser 417 
ZZUser 418 
ZZUser 419 
ZZUser 420 
ZZUser 421 
ZZUser 422 
ZZUser 423 
ZZUser 424 
ZZUser 425 
ZZUser 426 
ZZUser 427 
ZZUser 428 
ZZUser 429 
ZZUser 430 
ZZUser 431 
ZZUser 432 
ZZUser 433 
ZZUser 434 
ZZUser 435 
ZZUser 436 
ZZUser 437 
ZZUser 438 
ZZUser 439 
ZZUser 440 
ZZUser 441 
ZZUser 442 
ZZUser 443 
ZZUser 444 
ZZUser 445 
ZZUser 446 
ZZUser 447 
ZZUser 448 
ZZUser 449 
ZZUser 450 
ZZUser 451 
ZZUser 452 
ZZUser 453 
ZZUser 454 
ZZUser 455 
ZZUser 456 
ZZUser 457 
ZZUser 458 
ZZUser 459 
ZZUser 460 
ZZUser 461 
ZZUser 462 
ZZUser 463 
ZZUser 464 
ZZUser 465 
ZZUser 466 
ZZUser 467 
ZZUser 468 
ZZUser 469 
ZZUser 470 
ZZUser 471 
ZZUser 472 
ZZUser 473 
ZZUser 474 
ZZUser 475 
ZZUser 476 
ZZUser 477 
ZZUser 478 
ZZUser 479 
ZZUser 480 
ZZUser 481 
ZZUser 482 
ZZUser 483 
ZZUser 484 
ZZUser 485 
ZZUser 486 
ZZUser 487 
ZZUser 488 
ZZUser 489 
ZZUser 490 
ZZUser 491 
ZZUser 492 
ZZUser 493 
ZZUser 494 
ZZUser 495 
ZZUser 496 
ZZUser 497 
ZZUser 498 
ZZUser 499 
ZZUser 500 
ZZUser 501 
ZZUser 502 
ZZUser 503 
ZZUser 504 
ZZUser 505 
ZZUser 506 
ZZUser 507 
ZZUser 508 
ZZUser 509 
ZZUser 510 
ZZUser 511 
ZZUser 512 
ZZUser 513 
ZZUser 514 
ZZUser 515 
ZZUser 516 
ZZUser 517 
ZZUser 518 
ZZUser 519 
ZZUser 520 
ZZUser 521 
ZZUser 522 
ZZUser 523 
ZZUser 524 
ZZUser 525 
ZZUser 526 
ZZUser 527 
ZZUser 528 
ZZUser 529 
ZZUser 530 
ZZUser 531 
ZZUser 532 
ZZUser 533 
ZZUser 534 
ZZUser 535 
ZZUser 536 
ZZUser 537 
ZZUser 538 
ZZUser 539 
ZZUser 540 
ZZUser 541 
ZZUser 542 
ZZUser 543 
ZZUser 544 
ZZUser 545 
ZZUser 546 
ZZUser 547 
ZZUser 548 
ZZUser 549 
ZZUser 550 
ZZUser 551 
ZZUser 552 
ZZUser 553 
ZZUser 554 
ZZUser 555 
ZZUser 556 
ZZUser 557 
ZZUser 558 
ZZUser 559 
ZZUser 560 
ZZUser 561 
ZZUser 562 
ZZUser 563 
ZZUser 564 
ZZUser 565 
ZZUser 566 
ZZUser 567 
ZZUser 568 
ZZUser 569 
ZZUser 570 
ZZUser 571 
ZZUser 572 
ZZUser 573 
ZZUser 574 
ZZUser 575 
ZZUser 576 
ZZUser 577 
ZZUser 578 
ZZUser 579 
ZZUser 580 
ZZUser 581 
ZZUser 582 
ZZUser 583 
ZZUser 584 
ZZUser 585 
ZZUser 586 
ZZUser 587 
ZZUser 588 
ZZUser 589 
ZZUser 590 
ZZUser 591 
ZZUser 592 
ZZUser 593 
ZZUser 594 
ZZUser 595 
ZZUser 596 
ZZUser 597 
ZZUser 598 
ZZUser 599 
ZZUser 600 
ZZUser 601 
ZZUser 602 
ZZUser 603 
ZZUser 604 
ZZUser 605 
ZZUser 606 
ZZUser 607 
ZZUser 608 
ZZUser 609 
ZZUser 610 
ZZUser 611 
ZZUser 612 
ZZUser 613 
ZZUser 614 
ZZUser 615 
ZZUser 616 
ZZUser 617 
ZZUser 618 
ZZUser 619 
ZZUser 620 
ZZUser 621 
ZZUser 622 
ZZUser 623 
ZZUser 624 
ZZUser 625 
ZZUser 626 
ZZUser 627 
ZZUser 628 
ZZUser 629 
ZZUser 630 
ZZUser 631 
ZZUser 632 
ZZUser 633 
ZZUser 634 
ZZUser 635 
ZZUser 636 
ZZUser 637 
ZZUser 638 
ZZUser 639 
ZZUser 640 
ZZUser 641 
ZZUser 642 
ZZUser 643 
ZZUser 644 
ZZUser 645 
ZZUser 646 
ZZUser 647 
ZZUser 648 
ZZUser 649 
ZZUser 650 
ZZUser 651 
ZZUser 652 
ZZUser 653 
ZZUser 654 
ZZUser 655 
ZZUser 656 
ZZUser 657 
ZZUser 658 
ZZUser 659 
ZZUser 660 
ZZUser 661 
ZZUser 662 
ZZUser 663 
ZZUser 664 
ZZUser 665 
ZZUser 666 
ZZUser 667 
ZZUser 668 
ZZUser 669 
ZZUser 670 
ZZUser 671 
ZZUser 672 
ZZUser 673 
ZZUser 674 
ZZUser 675 
ZZUser 676 
ZZUser 677 
ZZUser 678 
ZZUser 679 
ZZUser 680 
ZZUser 681 
ZZUser 682 
ZZUser 683 
ZZUser 684 
ZZUser 685 
ZZUser 686 
ZZUser 687 
ZZUser 688 
ZZUser 689 
ZZUser 690 
ZZUser 691 
ZZUser 692 
ZZUser 693 
ZZUser 694 
ZZUser 695 
ZZUser 696 
ZZUser 697 
ZZUser 698 
ZZUser 699 
ZZUser 700 
ZZUser 701 
ZZUser 702 
ZZUser 703 
ZZUser 704 
ZZUser 705 
ZZUser 706 
ZZUser 707 
ZZUser 708 
ZZUser 709 
ZZUser 710 
ZZUser 711 
ZZUser 712 
ZZUser 713 
ZZUser 714 
ZZUser 715 
ZZUser 716 
ZZUser 717 
ZZUser 718 
ZZUser 719 
ZZUser 720 
ZZUser 721 
ZZUser 722 
ZZUser 723 
ZZUser 724 
ZZUser 725 
ZZUser 726 
ZZUser 727 
ZZUser 728 
ZZUser 729 
ZZUser 730 
ZZUser 731 
ZZUser 732 
ZZUser 733 
ZZUser 734 
ZZUser 735 
ZZUser 736 
ZZUser 737 
ZZUser 738 
ZZUser 739 
ZZUser 740 
ZZUser 741 
ZZUser 742 
ZZUser 743 
ZZUser 744 
ZZUser 745 
ZZUser 746 
ZZUser 747 
ZZUser 748 
ZZUser 749 
ZZUser 750 
ZZUser 751 
ZZUser 752 
ZZUser 753 
ZZUser 754 
ZZUser 755 
ZZUser 756 
ZZUser 757 
ZZUser 758 
ZZUser 759 
ZZUser 760 
ZZUser 761 
ZZUser 762  
 
xc 
Adam Keys 
Andy Hunt 
Brian Marick 
Brian McCallister 
Chad Fowler 
Chris Pine 
Daniel Berger 
Dave Thomas 
David Heinemeier Hansson 
Eric Hodel 
Esther Derby 
Greg Wilson 
James Gray 
Jeffrey Fredrick 
Johanna Rothman 
Juliet Thomas 
Maik Schmidt 
Marcel Molina 
Mike Clark 
Mike Gunderloy 
Mike Mason 
Ryan Davis 
Scott Barron 
Scott Davis 
Thomas Fuchs 
ZZUser 000 
ZZUser 001 
ZZUser 002 
ZZUser 003 
ZZUser 004 
ZZUser 005 
ZZUser 006 
ZZUser 007 
ZZUser 008 
ZZUser 009 
ZZUser 010 
ZZUser 011 
ZZUser 012 
ZZUser 013 
ZZUser 014 
ZZUser 015 
ZZUser 016 
ZZUser 017 
ZZUser 018 
ZZUser 019 
ZZUser 020 
ZZUser 021 
ZZUser 022 
ZZUser 023 
ZZUser 024 
ZZUser 025 
ZZUser 026 
ZZUser 027 
ZZUser 028 
ZZUser 029 
ZZUser 030 
ZZUser 031 
ZZUser 032 
ZZUser 033 
ZZUser 034 
ZZUser 035 
ZZUser 036 
ZZUser 037 
ZZUser 038 
ZZUser 039 
ZZUser 040 
ZZUser 041 
ZZUser 042 
ZZUser 043 
ZZUser 044 
ZZUser 045 
ZZUser 046 
ZZUser 047 
ZZUser 048 
ZZUser 049 
ZZUser 050 
ZZUser 051 
ZZUser 052 
ZZUser 053 
ZZUser 054 
ZZUser 055 
ZZUser 056 
ZZUser 057 
ZZUser 058 
ZZUser 059 
ZZUser 060 
ZZUser 061 
ZZUser 062 
ZZUser 063 
ZZUser 064 
ZZUser 065 
ZZUser 066 
ZZUser 067 
ZZUser 068 
ZZUser 069 
ZZUser 070 
ZZUser 071 
ZZUser 072 
ZZUser 073 
ZZUser 074 
ZZUser 075 
ZZUser 076 
ZZUser 077 
ZZUser 078 
ZZUser 079 
ZZUser 080 
ZZUser 081 
ZZUser 082 
ZZUser 083 
ZZUser 084 
ZZUser 085 
ZZUser 086 
ZZUser 087 
ZZUser 088 
ZZUser 089 
ZZUser 090 
ZZUser 091 
ZZUser 092 
ZZUser 093 
ZZUser 094 
ZZUser 095 
ZZUser 096 
ZZUser 097 
ZZUser 098 
ZZUser 099 
ZZUser 100 
ZZUser 101 
ZZUser 102 
ZZUser 103 
ZZUser 104 
ZZUser 105 
ZZUser 106 
ZZUser 107 
ZZUser 108 
ZZUser 109 
ZZUser 110 
ZZUser 111 
ZZUser 112 
ZZUser 113 
ZZUser 114 
ZZUser 115 
ZZUser 116 
ZZUser 117 
ZZUser 118 
ZZUser 119 
ZZUser 120 
ZZUser 121 
ZZUser 122 
ZZUser 123 
ZZUser 124 
ZZUser 125 
ZZUser 126 
ZZUser 127 
ZZUser 128 
ZZUser 129 
ZZUser 130 
ZZUser 131 
ZZUser 132 
ZZUser 133 
ZZUser 134 
ZZUser 135 
ZZUser 136 
ZZUser 137 
ZZUser 138 
ZZUser 139 
ZZUser 140 
ZZUser 141 
ZZUser 142 
ZZUser 143 
ZZUser 144 
ZZUser 145 
ZZUser 146 
ZZUser 147 
ZZUser 148 
ZZUser 149 
ZZUser 150 
ZZUser 151 
ZZUser 152 
ZZUser 153 
ZZUser 154 
ZZUser 155 
ZZUser 156 
ZZUser 157 
ZZUser 158 
ZZUser 159 
ZZUser 160 
ZZUser 161 
ZZUser 162 
ZZUser 163 
ZZUser 164 
ZZUser 165 
ZZUser 166 
ZZUser 167 
ZZUser 168 
ZZUser 169 
ZZUser 170 
ZZUser 171 
ZZUser 172 
ZZUser 173 
ZZUser 174 
ZZUser 175 
ZZUser 176 
ZZUser 177 
ZZUser 178 
ZZUser 179 
ZZUser 180 
ZZUser 181 
ZZUser 182 
ZZUser 183 
ZZUser 184 
ZZUser 185 
ZZUser 186 
ZZUser 187 
ZZUser 188 
ZZUser 189 
ZZUser 190 
ZZUser 191 
ZZUser 192 
ZZUser 193 
ZZUser 194 
ZZUser 195 
ZZUser 196 
ZZUser 197 
ZZUser 198 
ZZUser 199 
ZZUser 200 
ZZUser 201 
ZZUser 202 
ZZUser 203 
ZZUser 204 
ZZUser 205 
ZZUser 206 
ZZUser 207 
ZZUser 208 
ZZUser 209 
ZZUser 210 
ZZUser 211 
ZZUser 212 
ZZUser 213 
ZZUser 214 
ZZUser 215 
ZZUser 216 
ZZUser 217 
ZZUser 218 
ZZUser 219 
ZZUser 220 
ZZUser 221 
ZZUser 222 
ZZUser 223 
ZZUser 224 
ZZUser 225 
ZZUser 226 
ZZUser 227 
ZZUser 228 
ZZUser 229 
ZZUser 230 
ZZUser 231 
ZZUser 232 
ZZUser 233 
ZZUser 234 
ZZUser 235 
ZZUser 236 
ZZUser 237 
ZZUser 238 
ZZUser 239 
ZZUser 240 
ZZUser 241 
ZZUser 242 
ZZUser 243 
ZZUser 244 
ZZUser 245 
ZZUser 246 
ZZUser 247 
ZZUser 248 
ZZUser 249 
ZZUser 250 
ZZUser 251 
ZZUser 252 
ZZUser 253 
ZZUser 254 
ZZUser 255 
ZZUser 256 
ZZUser 257 
ZZUser 258 
ZZUser 259 
ZZUser 260 
ZZUser 261 
ZZUser 262 
ZZUser 263 
ZZUser 264 
ZZUser 265 
ZZUser 266 
ZZUser 267 
ZZUser 268 
ZZUser 269 
ZZUser 270 
ZZUser 271 
ZZUser 272 
ZZUser 273 
ZZUser 274 
ZZUser 275 
ZZUser 276 
ZZUser 277 
ZZUser 278 
ZZUser 279 
ZZUser 280 
ZZUser 281 
ZZUser 282 
ZZUser 283 
ZZUser 284 
ZZUser 285 
ZZUser 286 
ZZUser 287 
ZZUser 288 
ZZUser 289 
ZZUser 290 
ZZUser 291 
ZZUser 292 
ZZUser 293 
ZZUser 294 
ZZUser 295 
ZZUser 296 
ZZUser 297 
ZZUser 298 
ZZUser 299 
ZZUser 300 
ZZUser 301 
ZZUser 302 
ZZUser 303 
ZZUser 304 
ZZUser 305 
ZZUser 306 
ZZUser 307 
ZZUser 308 
ZZUser 309 
ZZUser 310 
ZZUser 311 
ZZUser 312 
ZZUser 313 
ZZUser 314 
ZZUser 315 
ZZUser 316 
ZZUser 317 
ZZUser 318 
ZZUser 319 
ZZUser 320 
ZZUser 321 
ZZUser 322 
ZZUser 323 
ZZUser 324 
ZZUser 325 
ZZUser 326 
ZZUser 327 
ZZUser 328 
ZZUser 329 
ZZUser 330 
ZZUser 331 
ZZUser 332 
ZZUser 333 
ZZUser 334 
ZZUser 335 
ZZUser 336 
ZZUser 337 
ZZUser 338 
ZZUser 339 
ZZUser 340 
ZZUser 341 
ZZUser 342 
ZZUser 343 
ZZUser 344 
ZZUser 345 
ZZUser 346 
ZZUser 347 
ZZUser 348 
ZZUser 349 
ZZUser 350 
ZZUser 351 
ZZUser 352 
ZZUser 353 
ZZUser 354 
ZZUser 355 
ZZUser 356 
ZZUser 357 
ZZUser 358 
ZZUser 359 
ZZUser 360 
ZZUser 361 
ZZUser 362 
ZZUser 363 
ZZUser 364 
ZZUser 365 
ZZUser 366 
ZZUser 367 
ZZUser 368 
ZZUser 369 
ZZUser 370 
ZZUser 371 
ZZUser 372 
ZZUser 373 
ZZUser 374 
ZZUser 375 
ZZUser 376 
ZZUser 377 
ZZUser 378 
ZZUser 379 
ZZUser 380 
ZZUser 381 
ZZUser 382 
ZZUser 383 
ZZUser 384 
ZZUser 385 
ZZUser 386 
ZZUser 387 
ZZUser 388 
ZZUser 389 
ZZUser 390 
ZZUser 391 
ZZUser 392 
ZZUser 393 
ZZUser 394 
ZZUser 395 
ZZUser 396 
ZZUser 397 
ZZUser 398 
ZZUser 399 
ZZUser 400 
ZZUser 401 
ZZUser 402 
ZZUser 403 
ZZUser 404 
ZZUser 405 
ZZUser 406 
ZZUser 407 
ZZUser 408 
ZZUser 409 
ZZUser 410 
ZZUser 411 
ZZUser 412 
ZZUser 413 
ZZUser 414 
ZZUser 415 
ZZUser 416 
ZZUser 417 
ZZUser 418 
ZZUser 419 
ZZUser 420 
ZZUser 421 
ZZUser 422 
ZZUser 423 
ZZUser 424 
ZZUser 425 
ZZUser 426 
ZZUser 427 
ZZUser 428 
ZZUser 429 
ZZUser 430 
ZZUser 431 
ZZUser 432 
ZZUser 433 
ZZUser 434 
ZZUser 435 
ZZUser 436 
ZZUser 437 
ZZUser 438 
ZZUser 439 
ZZUser 440 
ZZUser 441 
ZZUser 442 
ZZUser 443 
ZZUser 444 
ZZUser 445 
ZZUser 446 
ZZUser 447 
ZZUser 448 
ZZUser 449 
ZZUser 450 
ZZUser 451 
ZZUser 452 
ZZUser 453 
ZZUser 454 
ZZUser 455 
ZZUser 456 
ZZUser 457 
ZZUser 458 
ZZUser 459 
ZZUser 460 
ZZUser 461 
ZZUser 462 
ZZUser 463 
ZZUser 464 
ZZUser 465 
ZZUser 466 
ZZUser 467 
ZZUser 468 
ZZUser 469 
ZZUser 470 
ZZUser 471 
ZZUser 472 
ZZUser 473 
ZZUser 474 
ZZUser 475 
ZZUser 476 
ZZUser 477 
ZZUser 478 
ZZUser 479 
ZZUser 480 
ZZUser 481 
ZZUser 482 
ZZUser 483 
ZZUser 484 
ZZUser 485 
ZZUser 486 
ZZUser 487 
ZZUser 488 
ZZUser 489 
ZZUser 490 
ZZUser 491 
ZZUser 492 
ZZUser 493 
ZZUser 494 
ZZUser 495 
ZZUser 496 
ZZUser 497 
ZZUser 498 
ZZUser 499 
ZZUser 500 
ZZUser 501 
ZZUser 502 
ZZUser 503 
ZZUser 504 
ZZUser 505 
ZZUser 506 
ZZUser 507 
ZZUser 508 
ZZUser 509 
ZZUser 510 
ZZUser 511 
ZZUser 512 
ZZUser 513 
ZZUser 514 
ZZUser 515 
ZZUser 516 
ZZUser 517 
ZZUser 518 
ZZUser 519 
ZZUser 520 
ZZUser 521 
ZZUser 522 
ZZUser 523 
ZZUser 524 
ZZUser 525 
ZZUser 526 
ZZUser 527 
ZZUser 528 
ZZUser 529 
ZZUser 530 
ZZUser 531 
ZZUser 532 
ZZUser 533 
ZZUser 534 
ZZUser 535 
ZZUser 536 
ZZUser 537 
ZZUser 538 
ZZUser 539 
ZZUser 540 
ZZUser 541 
ZZUser 542 
ZZUser 543 
ZZUser 544 
ZZUser 545 
ZZUser 546 
ZZUser 547 
ZZUser 548 
ZZUser 549 
ZZUser 550 
ZZUser 551 
ZZUser 552 
ZZUser 553 
ZZUser 554 
ZZUser 555 
ZZUser 556 
ZZUser 557 
ZZUser 558 
ZZUser 559 
ZZUser 560 
ZZUser 561 
ZZUser 562 
ZZUser 563 
ZZUser 564 
ZZUser 565 
ZZUser 566 
ZZUser 567 
ZZUser 568 
ZZUser 569 
ZZUser 570 
ZZUser 571 
ZZUser 572 
ZZUser 573 
ZZUser 574 
ZZUser 575 
ZZUser 576 
ZZUser 577 
ZZUser 578 
ZZUser 579 
ZZUser 580 
ZZUser 581 
ZZUser 582 
ZZUser 583 
ZZUser 584 
ZZUser 585 
ZZUser 586 
ZZUser 587 
ZZUser 588 
ZZUser 589 
ZZUser 590 
ZZUser 591 
ZZUser 592 
ZZUser 593 
ZZUser 594 
ZZUser 595 
ZZUser 596 
ZZUser 597 
ZZUser 598 
ZZUser 599 
ZZUser 600 
ZZUser 601 
ZZUser 602 
ZZUser 603 
ZZUser 604 
ZZUser 605 
ZZUser 606 
ZZUser 607 
ZZUser 608 
ZZUser 609 
ZZUser 610 
ZZUser 611 
ZZUser 612 
ZZUser 613 
ZZUser 614 
ZZUser 615 
ZZUser 616 
ZZUser 617 
ZZUser 618 
ZZUser 619 
ZZUser 620 
ZZUser 621 
ZZUser 622 
ZZUser 623 
ZZUser 624 
ZZUser 625 
ZZUser 626 
ZZUser 627 
ZZUser 628 
ZZUser 629 
ZZUser 630 
ZZUser 631 
ZZUser 632 
ZZUser 633 
ZZUser 634 
ZZUser 635 
ZZUser 636 
ZZUser 637 
ZZUser 638 
ZZUser 639 
ZZUser 640 
ZZUser 641 
ZZUser 642 
ZZUser 643 
ZZUser 644 
ZZUser 645 
ZZUser 646 
ZZUser 647 
ZZUser 648 
ZZUser 649 
ZZUser 650 
ZZUser 651 
ZZUser 652 
ZZUser 653 
ZZUser 654 
ZZUser 655 
ZZUser 656 
ZZUser 657 
ZZUser 658 
ZZUser 659 
ZZUser 660 
ZZUser 661 
ZZUser 662 
ZZUser 663 
ZZUser 664 
ZZUser 665 
ZZUser 666 
ZZUser 667 
ZZUser 668 
ZZUser 669 
ZZUser 670 
ZZUser 671 
ZZUser 672 
ZZUser 673 
ZZUser 674 
ZZUser 675 
ZZUser 676 
ZZUser 677 
ZZUser 678 
ZZUser 679 
ZZUser 680 
ZZUser 681 
ZZUser 682 
ZZUser 683 
ZZUser 684 
ZZUser 685 
ZZUser 686 
ZZUser 687 
ZZUser 688 
ZZUser 689 
ZZUser 690 
ZZUser 691 
ZZUser 692 
ZZUser 693 
ZZUser 694 
ZZUser 695 
ZZUser 696 
ZZUser 697 
ZZUser 698 
ZZUser 699 
ZZUser 700 
ZZUser 701 
ZZUser 702 
ZZUser 703 
ZZUser 704 
ZZUser 705 
ZZUser 706 
ZZUser 707 
ZZUser 708 
ZZUser 709 
ZZUser 710 
ZZUser 711 
ZZUser 712 
ZZUser 713 
ZZUser 714 
ZZUser 715 
ZZUser 716 
ZZUser 717 
ZZUser 718 
ZZUser 719 
ZZUser 720 
ZZUser 721 
ZZUser 722 
ZZUser 723 
ZZUser 724 
ZZUser 725 
ZZUser 726 
ZZUser 727 
ZZUser 728 
ZZUser 729 
ZZUser 730 
ZZUser 731 
ZZUser 732 
ZZUser 733 
ZZUser 734 
ZZUser 735 
ZZUser 736 
ZZUser 737 
ZZUser 738 
ZZUser 739 
ZZUser 740 
ZZUser 741 
ZZUser 742 
ZZUser 743 
ZZUser 744 
ZZUser 745 
ZZUser 746 
ZZUser 747 
ZZUser 748 
ZZUser 749 
ZZUser 750 
ZZUser 751 
ZZUser 752 
ZZUser 753 
ZZUser 754 
ZZUser 755 
ZZUser 756 
ZZUser 757 
ZZUser 758 
ZZUser 759 
ZZUser 760 
ZZUser 761 
ZZUser 762  
 
 
 
 
 
Afghanistan 
Aland Islands 
Albania 
Algeria 
American Samoa 
Andorra 
Angola 
Anguilla 
Antarctica 
Antigua And Barbuda 
Argentina 
Armenia 
Aruba 
Australia 
Austria 
Azerbaijan 
Bahamas 
Bahrain 
Bangladesh 
Barbados 
Belarus 
Belgium 
Belize 
Benin 
Bermuda 
Bhutan 
Bolivia 
Bosnia and Herzegowina 
Botswana 
Bouvet Island 
Brazil 
British Indian Ocean Territory 
Brunei Darussalam 
Bulgaria 
Burkina Faso 
Burundi 
Cambodia 
Cameroon 
Canada 
Cape Verde 
Cayman Islands 
Central African Republic 
Chad 
Chile 
China 
Christmas Island 
Cocos (Keeling) Islands 
Colombia 
Comoros 
Congo 
Congo, the Democratic Republic of the 
Cook Islands 
Costa Rica 
Cote d'Ivoire 
Croatia 
Cuba 
Cyprus 
Czech Republic 
Denmark 
Djibouti 
Dominica 
Dominican Republic 
Ecuador 
Egypt 
El Salvador 
Equatorial Guinea 
Eritrea 
Estonia 
Ethiopia 
Falkland Islands (Malvinas) 
Faroe Islands 
Fiji 
Finland 
France 
French Guiana 
French Polynesia 
French Southern Territories 
Gabon 
Gambia 
Georgia 
Germany 
Ghana 
Gibraltar 
Greece 
Greenland 
Grenada 
Guadeloupe 
Guam 
Guatemala 
Guernsey 
Guinea 
Guinea-Bissau 
Guyana 
Haiti 
Heard and McDonald Islands 
Holy See (Vatican City State) 
Honduras 
Hong Kong 
Hungary 
Iceland 
India 
Indonesia 
Iran, Islamic Republic of 
Iraq 
Ireland 
Isle of Man 
Israel 
Italy 
Jamaica 
Japan 
Jersey 
Jordan 
Kazakhstan 
Kenya 
Kiribati 
Korea, Democratic People's Republic of 
Korea, Republic of 
Kuwait 
Kyrgyzstan 
Lao People's Democratic Republic 
Latvia 
Lebanon 
Lesotho 
Liberia 
Libyan Arab Jamahiriya 
Liechtenstein 
Lithuania 
Luxembourg 
Macao 
Macedonia, The Former Yugoslav Republic Of 
Madagascar 
Malawi 
Malaysia 
Maldives 
Mali 
Malta 
Marshall Islands 
Martinique 
Mauritania 
Mauritius 
Mayotte 
Mexico 
Micronesia, Federated States of 
Moldova, Republic of 
Monaco 
Mongolia 
Montenegro 
Montserrat 
Morocco 
Mozambique 
Myanmar 
Namibia 
Nauru 
Nepal 
Netherlands 
Netherlands Antilles 
New Caledonia 
New Zealand 
Nicaragua 
Niger 
Nigeria 
Niue 
Norfolk Island 
Northern Mariana Islands 
Norway 
Oman 
Pakistan 
Palau 
Palestinian Territory, Occupied 
Panama 
Papua New Guinea 
Paraguay 
Peru 
Philippines 
Pitcairn 
Poland 
Portugal 
Puerto Rico 
Qatar 
Reunion 
Romania 
Russian Federation 
Rwanda 
Saint Barthelemy 
Saint Helena 
Saint Kitts and Nevis 
Saint Lucia 
Saint Pierre and Miquelon 
Saint Vincent and the Grenadines 
Samoa 
San Marino 
Sao Tome and Principe 
Saudi Arabia 
Senegal 
Serbia 
Seychelles 
Sierra Leone 
Singapore 
Slovakia 
Slovenia 
Solomon Islands 
Somalia 
South Africa 
South Georgia and the South Sandwich Islands 
Spain 
Sri Lanka 
Sudan 
Suriname 
Svalbard and Jan Mayen 
Swaziland 
Sweden 
Switzerland 
Syrian Arab Republic 
Taiwan, Province of China 
Tajikistan 
Tanzania, United Republic of 
Thailand 
Timor-Leste 
Togo 
Tokelau 
Tonga 
Trinidad and Tobago 
Tunisia 
Turkey 
Turkmenistan 
Turks and Caicos Islands 
Tuvalu 
Uganda 
Ukraine 
United Arab Emirates 
United Kingdom 
United States 
United States Minor Outlying Islands 
Uruguay 
Uzbekistan 
Vanuatu 
Venezuela 
Viet Nam 
Virgin Islands, British 
Virgin Islands, U.S. 
Wallis and Futuna 
Western Sahara 
Yemen 
Zambia 
Zimbabwe  
 
United Kingom 
United States ------------- 
Afghanistan 
Aland Islands 
Albania 
Algeria 
American Samoa 
Andorra 
Angola 
Anguilla 
Antarctica 
Antigua And Barbuda 
Argentina 
Armenia 
Aruba 
Australia 
Austria 
Azerbaijan 
Bahamas 
Bahrain 
Bangladesh 
Barbados 
Belarus 
Belgium 
Belize 
Benin 
Bermuda 
Bhutan 
Bolivia 
Bosnia and Herzegowina 
Botswana 
Bouvet Island 
Brazil 
British Indian Ocean Territory 
Brunei Darussalam 
Bulgaria 
Burkina Faso 
Burundi 
Cambodia 
Cameroon 
Canada 
Cape Verde 
Cayman Islands 
Central African Republic 
Chad 
Chile 
China 
Christmas Island 
Cocos (Keeling) Islands 
Colombia 
Comoros 
Congo 
Congo, the Democratic Republic of the 
Cook Islands 
Costa Rica 
Cote d'Ivoire 
Croatia 
Cuba 
Cyprus 
Czech Republic 
Denmark 
Djibouti 
Dominica 
Dominican Republic 
Ecuador 
Egypt 
El Salvador 
Equatorial Guinea 
Eritrea 
Estonia 
Ethiopia 
Falkland Islands (Malvinas) 
Faroe Islands 
Fiji 
Finland 
France 
French Guiana 
French Polynesia 
French Southern Territories 
Gabon 
Gambia 
Georgia 
Germany 
Ghana 
Gibraltar 
Greece 
Greenland 
Grenada 
Guadeloupe 
Guam 
Guatemala 
Guernsey 
Guinea 
Guinea-Bissau 
Guyana 
Haiti 
Heard and McDonald Islands 
Holy See (Vatican City State) 
Honduras 
Hong Kong 
Hungary 
Iceland 
India 
Indonesia 
Iran, Islamic Republic of 
Iraq 
Ireland 
Isle of Man 
Israel 
Italy 
Jamaica 
Japan 
Jersey 
Jordan 
Kazakhstan 
Kenya 
Kiribati 
Korea, Democratic People's Republic of 
Korea, Republic of 
Kuwait 
Kyrgyzstan 
Lao People's Democratic Republic 
Latvia 
Lebanon 
Lesotho 
Liberia 
Libyan Arab Jamahiriya 
Liechtenstein 
Lithuania 
Luxembourg 
Macao 
Macedonia, The Former Yugoslav Republic Of 
Madagascar 
Malawi 
Malaysia 
Maldives 
Mali 
Malta 
Marshall Islands 
Martinique 
Mauritania 
Mauritius 
Mayotte 
Mexico 
Micronesia, Federated States of 
Moldova, Republic of 
Monaco 
Mongolia 
Montenegro 
Montserrat 
Morocco 
Mozambique 
Myanmar 
Namibia 
Nauru 
Nepal 
Netherlands 
Netherlands Antilles 
New Caledonia 
New Zealand 
Nicaragua 
Niger 
Nigeria 
Niue 
Norfolk Island 
Northern Mariana Islands 
Norway 
Oman 
Pakistan 
Palau 
Palestinian Territory, Occupied 
Panama 
Papua New Guinea 
Paraguay 
Peru 
Philippines 
Pitcairn 
Poland 
Portugal 
Puerto Rico 
Qatar 
Reunion 
Romania 
Russian Federation 
Rwanda 
Saint Barthelemy 
Saint Helena 
Saint Kitts and Nevis 
Saint Lucia 
Saint Pierre and Miquelon 
Saint Vincent and the Grenadines 
Samoa 
San Marino 
Sao Tome and Principe 
Saudi Arabia 
Senegal 
Serbia 
Seychelles 
Sierra Leone 
Singapore 
Slovakia 
Slovenia 
Solomon Islands 
Somalia 
South Africa 
South Georgia and the South Sandwich Islands 
Spain 
Sri Lanka 
Sudan 
Suriname 
Svalbard and Jan Mayen 
Swaziland 
Sweden 
Switzerland 
Syrian Arab Republic 
Taiwan, Province of China 
Tajikistan 
Tanzania, United Republic of 
Thailand 
Timor-Leste 
Togo 
Tokelau 
Tonga 
Trinidad and Tobago 
Tunisia 
Turkey 
Turkmenistan 
Turks and Caicos Islands 
Tuvalu 
Uganda 
Ukraine 
United Arab Emirates 
United Kingdom 
United States 
United States Minor Outlying Islands 
Uruguay 
Uzbekistan 
Vanuatu 
Venezuela 
Viet Nam 
Virgin Islands, British 
Virgin Islands, U.S. 
Wallis and Futuna 
Western Sahara 
Yemen 
Zambia 
Zimbabwe  
 
(GMT-11:00) International Date Line West 
(GMT-11:00) Midway Island 
(GMT-11:00) Samoa 
(GMT-10:00) Hawaii 
(GMT-09:00) Alaska 
(GMT-08:00) Pacific Time (US & Canada) 
(GMT-08:00) Tijuana 
(GMT-07:00) Arizona 
(GMT-07:00) Chihuahua 
(GMT-07:00) Mazatlan 
(GMT-07:00) Mountain Time (US & Canada) 
(GMT-06:00) Central America 
(GMT-06:00) Central Time (US & Canada) 
(GMT-06:00) Guadalajara 
(GMT-06:00) Mexico City 
(GMT-06:00) Monterrey 
(GMT-06:00) Saskatchewan 
(GMT-05:00) Bogota 
(GMT-05:00) Eastern Time (US & Canada) 
(GMT-05:00) Indiana (East) 
(GMT-05:00) Lima 
(GMT-05:00) Quito 
(GMT-05:30) Caracas 
(GMT-04:00) Atlantic Time (Canada) 
(GMT-04:00) La Paz 
(GMT-04:00) Santiago 
(GMT-04:30) Newfoundland 
(GMT-03:00) Brasilia 
(GMT-03:00) Buenos Aires 
(GMT-03:00) Georgetown 
(GMT-03:00) Greenland 
(GMT-02:00) Mid-Atlantic 
(GMT-01:00) Azores 
(GMT-01:00) Cape Verde Is. 
(GMT+00:00) Casablanca 
(GMT+00:00) Dublin 
(GMT+00:00) Edinburgh 
(GMT+00:00) Lisbon 
(GMT+00:00) London 
(GMT+00:00) Monrovia 
(GMT+00:00) UTC 
(GMT+01:00) Amsterdam 
(GMT+01:00) Belgrade 
(GMT+01:00) Berlin 
(GMT+01:00) Bern 
(GMT+01:00) Bratislava 
(GMT+01:00) Brussels 
(GMT+01:00) Budapest 
(GMT+01:00) Copenhagen 
(GMT+01:00) Ljubljana 
(GMT+01:00) Madrid 
(GMT+01:00) Paris 
(GMT+01:00) Prague 
(GMT+01:00) Rome 
(GMT+01:00) Sarajevo 
(GMT+01:00) Skopje 
(GMT+01:00) Stockholm 
(GMT+01:00) Vienna 
(GMT+01:00) Warsaw 
(GMT+01:00) West Central Africa 
(GMT+01:00) Zagreb 
(GMT+02:00) Athens 
(GMT+02:00) Bucharest 
(GMT+02:00) Cairo 
(GMT+02:00) Harare 
(GMT+02:00) Helsinki 
(GMT+02:00) Istanbul 
(GMT+02:00) Jerusalem 
(GMT+02:00) Kyiv 
(GMT+02:00) Minsk 
(GMT+02:00) Pretoria 
(GMT+02:00) Riga 
(GMT+02:00) Sofia 
(GMT+02:00) Tallinn 
(GMT+02:00) Vilnius 
(GMT+03:00) Baghdad 
(GMT+03:00) Kuwait 
(GMT+03:00) Moscow 
(GMT+03:00) Nairobi 
(GMT+03:00) Riyadh 
(GMT+03:00) St. Petersburg 
(GMT+03:00) Volgograd 
(GMT+03:30) Tehran 
(GMT+04:00) Abu Dhabi 
(GMT+04:00) Baku 
(GMT+04:00) Muscat 
(GMT+04:00) Tbilisi 
(GMT+04:00) Yerevan 
(GMT+04:30) Kabul 
(GMT+05:00) Ekaterinburg 
(GMT+05:00) Islamabad 
(GMT+05:00) Karachi 
(GMT+05:00) Tashkent 
(GMT+05:30) Chennai 
(GMT+05:30) Kolkata 
(GMT+05:30) Mumbai 
(GMT+05:30) New Delhi 
(GMT+05:30) Sri Jayawardenepura 
(GMT+05:45) Kathmandu 
(GMT+06:00) Almaty 
(GMT+06:00) Astana 
(GMT+06:00) Dhaka 
(GMT+06:00) Novosibirsk 
(GMT+06:30) Rangoon 
(GMT+07:00) Bangkok 
(GMT+07:00) Hanoi 
(GMT+07:00) Jakarta 
(GMT+07:00) Krasnoyarsk 
(GMT+08:00) Beijing 
(GMT+08:00) Chongqing 
(GMT+08:00) Hong Kong 
(GMT+08:00) Irkutsk 
(GMT+08:00) Kuala Lumpur 
(GMT+08:00) Perth 
(GMT+08:00) Singapore 
(GMT+08:00) Taipei 
(GMT+08:00) Ulaan Bataar 
(GMT+08:00) Urumqi 
(GMT+09:00) Osaka 
(GMT+09:00) Sapporo 
(GMT+09:00) Seoul 
(GMT+09:00) Tokyo 
(GMT+09:00) Yakutsk 
(GMT+09:30) Adelaide 
(GMT+09:30) Darwin 
(GMT+10:00) Brisbane 
(GMT+10:00) Canberra 
(GMT+10:00) Guam 
(GMT+10:00) Hobart 
(GMT+10:00) Melbourne 
(GMT+10:00) Port Moresby 
(GMT+10:00) Sydney 
(GMT+10:00) Vladivostok 
(GMT+11:00) Magadan 
(GMT+11:00) New Caledonia 
(GMT+11:00) Solomon Is. 
(GMT+12:00) Auckland 
(GMT+12:00) Fiji 
(GMT+12:00) Kamchatka 
(GMT+12:00) Marshall Is. 
(GMT+12:00) Wellington 
(GMT+13:00) Nuku'alofa  
 
(GMT-10:00) Hawaii 
(GMT-09:00) Alaska 
(GMT-08:00) Pacific Time (US & Canada) 
(GMT-07:00) Arizona 
(GMT-07:00) Mountain Time (US & Canada) 
(GMT-06:00) Central Time (US & Canada) 
(GMT-05:00) Eastern Time (US & Canada) 
(GMT-05:00) Indiana (East) ------------- 
(GMT-11:00) International Date Line West 
(GMT-11:00) Midway Island 
(GMT-11:00) Samoa 
(GMT-08:00) Tijuana 
(GMT-07:00) Chihuahua 
(GMT-07:00) Mazatlan 
(GMT-06:00) Central America 
(GMT-06:00) Guadalajara 
(GMT-06:00) Mexico City 
(GMT-06:00) Monterrey 
(GMT-06:00) Saskatchewan 
(GMT-05:00) Bogota 
(GMT-05:00) Lima 
(GMT-05:00) Quito 
(GMT-05:30) Caracas 
(GMT-04:00) Atlantic Time (Canada) 
(GMT-04:00) La Paz 
(GMT-04:00) Santiago 
(GMT-04:30) Newfoundland 
(GMT-03:00) Brasilia 
(GMT-03:00) Buenos Aires 
(GMT-03:00) Georgetown 
(GMT-03:00) Greenland 
(GMT-02:00) Mid-Atlantic 
(GMT-01:00) Azores 
(GMT-01:00) Cape Verde Is. 
(GMT+00:00) Casablanca 
(GMT+00:00) Dublin 
(GMT+00:00) Edinburgh 
(GMT+00:00) Lisbon 
(GMT+00:00) London 
(GMT+00:00) Monrovia 
(GMT+00:00) UTC 
(GMT+01:00) Amsterdam 
(GMT+01:00) Belgrade 
(GMT+01:00) Berlin 
(GMT+01:00) Bern 
(GMT+01:00) Bratislava 
(GMT+01:00) Brussels 
(GMT+01:00) Budapest 
(GMT+01:00) Copenhagen 
(GMT+01:00) Ljubljana 
(GMT+01:00) Madrid 
(GMT+01:00) Paris 
(GMT+01:00) Prague 
(GMT+01:00) Rome 
(GMT+01:00) Sarajevo 
(GMT+01:00) Skopje 
(GMT+01:00) Stockholm 
(GMT+01:00) Vienna 
(GMT+01:00) Warsaw 
(GMT+01:00) West Central Africa 
(GMT+01:00) Zagreb 
(GMT+02:00) Athens 
(GMT+02:00) Bucharest 
(GMT+02:00) Cairo 
(GMT+02:00) Harare 
(GMT+02:00) Helsinki 
(GMT+02:00) Istanbul 
(GMT+02:00) Jerusalem 
(GMT+02:00) Kyiv 
(GMT+02:00) Minsk 
(GMT+02:00) Pretoria 
(GMT+02:00) Riga 
(GMT+02:00) Sofia 
(GMT+02:00) Tallinn 
(GMT+02:00) Vilnius 
(GMT+03:00) Baghdad 
(GMT+03:00) Kuwait 
(GMT+03:00) Moscow 
(GMT+03:00) Nairobi 
(GMT+03:00) Riyadh 
(GMT+03:00) St. Petersburg 
(GMT+03:00) Volgograd 
(GMT+03:30) Tehran 
(GMT+04:00) Abu Dhabi 
(GMT+04:00) Baku 
(GMT+04:00) Muscat 
(GMT+04:00) Tbilisi 
(GMT+04:00) Yerevan 
(GMT+04:30) Kabul 
(GMT+05:00) Ekaterinburg 
(GMT+05:00) Islamabad 
(GMT+05:00) Karachi 
(GMT+05:00) Tashkent 
(GMT+05:30) Chennai 
(GMT+05:30) Kolkata 
(GMT+05:30) Mumbai 
(GMT+05:30) New Delhi 
(GMT+05:30) Sri Jayawardenepura 
(GMT+05:45) Kathmandu 
(GMT+06:00) Almaty 
(GMT+06:00) Astana 
(GMT+06:00) Dhaka 
(GMT+06:00) Novosibirsk 
(GMT+06:30) Rangoon 
(GMT+07:00) Bangkok 
(GMT+07:00) Hanoi 
(GMT+07:00) Jakarta 
(GMT+07:00) Krasnoyarsk 
(GMT+08:00) Beijing 
(GMT+08:00) Chongqing 
(GMT+08:00) Hong Kong 
(GMT+08:00) Irkutsk 
(GMT+08:00) Kuala Lumpur 
(GMT+08:00) Perth 
(GMT+08:00) Singapore 
(GMT+08:00) Taipei 
(GMT+08:00) Ulaan Bataar 
(GMT+08:00) Urumqi 
(GMT+09:00) Osaka 
(GMT+09:00) Sapporo 
(GMT+09:00) Seoul 
(GMT+09:00) Tokyo 
(GMT+09:00) Yakutsk 
(GMT+09:30) Adelaide 
(GMT+09:30) Darwin 
(GMT+10:00) Brisbane 
(GMT+10:00) Canberra 
(GMT+10:00) Guam 
(GMT+10:00) Hobart 
(GMT+10:00) Melbourne 
(GMT+10:00) Port Moresby 
(GMT+10:00) Sydney 
(GMT+10:00) Vladivostok 
(GMT+11:00) Magadan 
(GMT+11:00) New Caledonia 
(GMT+11:00) Solomon Is. 
(GMT+12:00) Auckland 
(GMT+12:00) Fiji 
(GMT+12:00) Kamchatka 
(GMT+12:00) Marshall Is. 
(GMT+12:00) Wellington 
(GMT+13:00) Nuku'alofa  
 
Shipping:  
Ground Parcel 
Media Mail Airmail 
Certified Mail Priority 
Express  
 
 
 
 
 
 
 
 
 
 
     
    
    cp -vr /home/rubys/git/awdwr/data/code/e1/views/app/views/products app/views 
    `/home/rubys/git/awdwr/data/code/e1/views/app/views/products' -> `app/views/products' 
    `/home/rubys/git/awdwr/data/code/e1/views/app/views/products/show.html.erb' -> `app/views/products/show.html.erb' 
    `/home/rubys/git/awdwr/data/code/e1/views/app/views/products/new.html.erb' -> `app/views/products/new.html.erb' 
    `/home/rubys/git/awdwr/data/code/e1/views/app/views/products/create.html.erb' -> `app/views/products/create.html.erb' 
    get /products/new 
    
    
    
      23.6 Custom Form Builders 
     
    cp -vr /home/rubys/git/awdwr/data/code/e1/views/app/helpers/tagged_builder.rb app/helpers 
    `/home/rubys/git/awdwr/data/code/e1/views/app/helpers/tagged_builder.rb' -> `app/helpers/tagged_builder.rb' 
    cp -vr /home/rubys/git/awdwr/data/code/e1/views/app/views/builder app/views 
    `/home/rubys/git/awdwr/data/code/e1/views/app/views/builder' -> `app/views/builder' 
    `/home/rubys/git/awdwr/data/code/e1/views/app/views/builder/new.html.erb' -> `app/views/builder/new.html.erb' 
    `/home/rubys/git/awdwr/data/code/e1/views/app/views/builder/new_with_helper.html.erb' -> `app/views/builder/new_with_helper.html.erb' 
    get /builder/new 
    
    
    cp -vr /home/rubys/git/awdwr/data/code/e1/views/app/helpers/builder_helper.rb app/helpers 
    `/home/rubys/git/awdwr/data/code/e1/views/app/helpers/builder_helper.rb' -> `app/helpers/builder_helper.rb' 
    get /builder/new_with_helper 
    
    
    cp -vr /home/rubys/git/awdwr/data/code/e1/views/app/views/array app/views 
    `/home/rubys/git/awdwr/data/code/e1/views/app/views/array' -> `app/views/array' 
    `/home/rubys/git/awdwr/data/code/e1/views/app/views/array/edit.html.erb' -> `app/views/array/edit.html.erb' 
    get /array/edit 
    
    
    
      23.7 Working with Nonmodel Fields 
     
    get /test/calculate 
    
    
    
      23.8 Uploading Files to Rails Applications 
     
    ruby script/generate model picture comment:string name:string content_type:string data:binary 
          exists  app/models/ 
          exists  test/unit/ 
          exists  test/fixtures/ 
          create  app/models/picture.rb 
          create  test/unit/picture_test.rb 
          create  test/fixtures/pictures.yml 
          exists  db/migrate 
          create  db/migrate/20090518123749_create_pictures.rb 
    cp -v /home/rubys/git/awdwr/data/code/e1/views/db/migrate/*pictures.rb db/migrate/*pictures.rb 
    `/home/rubys/git/awdwr/data/code/e1/views/db/migrate/003_create_pictures.rb' -> `db/migrate/20090518123749_create_pictures.rb' 
    cp -v /home/rubys/git/awdwr/data/code/e1/views/app/models/picture.rb app/models 
    `/home/rubys/git/awdwr/data/code/e1/views/app/models/picture.rb' -> `app/models/picture.rb' 
    rake db:migrate 
    mv 20090518123749_create_pictures.rb 20080601000004_create_pictures.rb 
    (in /home/rubys/git/awdwr/work/view) 
    ==  CreatePictures: migrating ================================================= 
    -- create_table(:pictures) 
       -> 0.0014s 
    ==  CreatePictures: migrated (0.0015s) ======================================== 
      
    cp -vr /home/rubys/git/awdwr/data/code/e1/views/app/views/upload app/views 
    `/home/rubys/git/awdwr/data/code/e1/views/app/views/upload' -> `app/views/upload' 
    `/home/rubys/git/awdwr/data/code/e1/views/app/views/upload/show.html.erb' -> `app/views/upload/show.html.erb' 
    `/home/rubys/git/awdwr/data/code/e1/views/app/views/upload/save.html.erb' -> `app/views/upload/save.html.erb' 
    `/home/rubys/git/awdwr/data/code/e1/views/app/views/upload/get.html.erb' -> `app/views/upload/get.html.erb' 
    get /upload/get 
    
    
    
      23.9 Layouts and Components 
     
    cp -vr /home/rubys/git/awdwr/data/code/e1/views/app/views/partial app/views 
    `/home/rubys/git/awdwr/data/code/e1/views/app/views/partial' -> `app/views/partial' 
    `/home/rubys/git/awdwr/data/code/e1/views/app/views/partial/_animal.html.erb' -> `app/views/partial/_animal.html.erb' 
    `/home/rubys/git/awdwr/data/code/e1/views/app/views/partial/_spacer.html.erb' -> `app/views/partial/_spacer.html.erb' 
    `/home/rubys/git/awdwr/data/code/e1/views/app/views/partial/_partial.html.erb' -> `app/views/partial/_partial.html.erb' 
    `/home/rubys/git/awdwr/data/code/e1/views/app/views/partial/list.html.erb' -> `app/views/partial/list.html.erb' 
    `/home/rubys/git/awdwr/data/code/e1/views/app/views/partial/_article.html.erb' -> `app/views/partial/_article.html.erb' 
    `/home/rubys/git/awdwr/data/code/e1/views/app/views/partial/test1.html.erb' -> `app/views/partial/test1.html.erb' 
    get /partial/list 
    
The animal is ant
The animal is bee
The animal is cat
The animal is dog
The animal is elk
     
    
    
      23.10 Caching, Part Two 
     
    ruby script/generate model article body:text 
          exists  app/models/ 
          exists  test/unit/ 
          exists  test/fixtures/ 
          create  app/models/article.rb 
          create  test/unit/article_test.rb 
          create  test/fixtures/articles.yml 
          exists  db/migrate 
          create  db/migrate/20090518123752_create_articles.rb 
    cp -v /home/rubys/git/awdwr/data/code/e1/views/app/models/article.rb app/models 
    `/home/rubys/git/awdwr/data/code/e1/views/app/models/article.rb' -> `app/models/article.rb' 
    cp -vr /home/rubys/git/awdwr/data/code/e1/views/app/views/blog app/views 
    `/home/rubys/git/awdwr/data/code/e1/views/app/views/blog' -> `app/views/blog' 
    `/home/rubys/git/awdwr/data/code/e1/views/app/views/blog/index.html.erb' -> `app/views/blog/index.html.erb' 
    `/home/rubys/git/awdwr/data/code/e1/views/app/views/blog/list.html.erb' -> `app/views/blog/list.html.erb' 
    get /blog/list 
    
Mon May 18 08:37:52 -0400 2009   
            
  
                 
Mon May 18 08:37:52 -0400 2009   
    
 
    
    cp -vr /home/rubys/git/awdwr/data/code/e1/views/app/views/blog1 app/views 
    `/home/rubys/git/awdwr/data/code/e1/views/app/views/blog1' -> `app/views/blog1' 
    `/home/rubys/git/awdwr/data/code/e1/views/app/views/blog1/list.html.erb' -> `app/views/blog1/list.html.erb' 
    get /blog1/list 
    
Mon May 18 08:37:52 -0400 2009 
          
  
               
Mon May 18 08:37:52 -0400 2009 
    
 
    
    cp -vr /home/rubys/git/awdwr/data/code/e1/views/app/views/blog2 app/views 
    `/home/rubys/git/awdwr/data/code/e1/views/app/views/blog2' -> `app/views/blog2' 
    `/home/rubys/git/awdwr/data/code/e1/views/app/views/blog2/list.html.erb' -> `app/views/blog2/list.html.erb' 
    get /blog2/list 
    
  
  
    There are a total of 4 articles.
  
	
     
    
    
      23.11 Adding New Templating Systems 
     
    cp -v /home/rubys/git/awdwr/data/code/e1/views/config/initializers/* config/initializers/ 
    `/home/rubys/git/awdwr/data/code/e1/views/config/initializers/register_eval_template.rb' -> `config/initializers/register_eval_template.rb' 
    `/home/rubys/git/awdwr/data/code/e1/views/config/initializers/register_rdoc_template.rb' -> `config/initializers/register_rdoc_template.rb' 
    cp -v /home/rubys/git/awdwr/data/code/e1/views/lib/*_template.rb lib 
    `/home/rubys/git/awdwr/data/code/e1/views/lib/eval_template.rb' -> `lib/eval_template.rb' 
    `/home/rubys/git/awdwr/data/code/e1/views/lib/rdoc_template.rb' -> `lib/rdoc_template.rb' 
    restart 
    get /test/example 
    
Greetings from RDoc 
Let’s see if we’re doing real  formatting…
This should be
 
A bullet list all nicely formatted
 
 
     
    
    get /test/date_format 
    
distance_of_time_in_words(Time.now, Time.local(2005, 12, 25)) => over 3 years
time_ago_in_words(Time.utc(2004, 12, 25)) => over 4 years    
    
    get /test/example1 
    
Time.now => Mon May 18 08:38:01 -0400 2009
request.path => /test/example1
a = 1 => 1
b = 2 => 2
a + b => 3    
    
    
      25.1 Sending E-mail 
     
    ruby /home/rubys/git/rails/railties/bin/rails mailer 
          create   
          create  app/controllers 
          create  app/helpers 
          create  app/models 
          create  app/views/layouts 
          create  config/environments 
          create  config/initializers 
          create  config/locales 
          create  db 
          create  doc 
          create  lib 
          create  lib/tasks 
          create  log 
          create  public/images 
          create  public/javascripts 
          create  public/stylesheets 
          create  script/performance 
          create  test/fixtures 
          create  test/functional 
          create  test/integration 
          create  test/performance 
          create  test/unit 
          create  vendor 
          create  vendor/plugins 
          create  tmp/sessions 
          create  tmp/sockets 
          create  tmp/cache 
          create  tmp/pids 
          create  Rakefile 
          create  README 
          create  app/controllers/application_controller.rb 
          create  app/helpers/application_helper.rb 
          create  config/database.yml 
          create  config/routes.rb 
          create  config/locales/en.yml 
          create  db/seeds.rb 
          create  config/initializers/backtrace_silencers.rb 
          create  config/initializers/inflections.rb 
          create  config/initializers/mime_types.rb 
          create  config/initializers/new_rails_defaults.rb 
          create  config/initializers/session_store.rb 
          create  config/environment.rb 
          create  config/boot.rb 
          create  config/environments/production.rb 
          create  config/environments/development.rb 
          create  config/environments/test.rb 
          create  script/about 
          create  script/console 
          create  script/dbconsole 
          create  script/destroy 
          create  script/generate 
          create  script/runner 
          create  script/server 
          create  script/plugin 
          create  script/performance/benchmarker 
          create  script/performance/profiler 
          create  test/test_helper.rb 
          create  test/performance/browsing_test.rb 
          create  public/404.html 
          create  public/422.html 
          create  public/500.html 
          create  public/index.html 
          create  public/favicon.ico 
          create  public/robots.txt 
          create  public/images/rails.png 
          create  public/javascripts/prototype.js 
          create  public/javascripts/effects.js 
          create  public/javascripts/dragdrop.js 
          create  public/javascripts/controls.js 
          create  public/javascripts/application.js 
          create  doc/README_FOR_APP 
          create  log/server.log 
          create  log/production.log 
          create  log/development.log 
          create  log/test.log 
    ln -s /home/rubys/git/rails vendor/rails 
    ruby script/generate mailer OrderMailer confirm sent 
          exists  app/models/ 
          create  app/views/order_mailer 
          exists  test/unit/ 
          create  test/fixtures/order_mailer 
          create  app/models/order_mailer.rb 
          create  test/unit/order_mailer_test.rb 
          create  app/views/order_mailer/confirm.erb 
          create  test/fixtures/order_mailer/confirm 
          create  app/views/order_mailer/sent.erb 
          create  test/fixtures/order_mailer/sent 
    cp -vr /home/rubys/git/awdwr/data/code/e1/mailer/db/migrate db 
    `/home/rubys/git/awdwr/data/code/e1/mailer/db/migrate' -> `db/migrate' 
    `/home/rubys/git/awdwr/data/code/e1/mailer/db/migrate/002_create_line_items.rb' -> `db/migrate/002_create_line_items.rb' 
    `/home/rubys/git/awdwr/data/code/e1/mailer/db/migrate/001_create_products.rb' -> `db/migrate/001_create_products.rb' 
    `/home/rubys/git/awdwr/data/code/e1/mailer/db/migrate/003_create_orders.rb' -> `db/migrate/003_create_orders.rb' 
    `/home/rubys/git/awdwr/data/code/e1/mailer/db/migrate/004_populate_data.rb' -> `db/migrate/004_populate_data.rb' 
    cp -v /home/rubys/git/awdwr/data/code/e1/mailer/app/controllers/* app/controllers 
    `/home/rubys/git/awdwr/data/code/e1/mailer/app/controllers/application.rb' -> `app/controllers/application.rb' 
    `/home/rubys/git/awdwr/data/code/e1/mailer/app/controllers/order_controller.rb' -> `app/controllers/order_controller.rb' 
    `/home/rubys/git/awdwr/data/code/e1/mailer/app/controllers/test_controller.rb' -> `app/controllers/test_controller.rb' 
    cp -v /home/rubys/git/awdwr/data/code/e1/mailer/app/models/* app/models 
    `/home/rubys/git/awdwr/data/code/e1/mailer/app/models/incoming_ticket_handler.rb' -> `app/models/incoming_ticket_handler.rb' 
    `/home/rubys/git/awdwr/data/code/e1/mailer/app/models/line_item.rb' -> `app/models/line_item.rb' 
    `/home/rubys/git/awdwr/data/code/e1/mailer/app/models/order.rb' -> `app/models/order.rb' 
    `/home/rubys/git/awdwr/data/code/e1/mailer/app/models/order_mailer.rb' -> `app/models/order_mailer.rb' 
    `/home/rubys/git/awdwr/data/code/e1/mailer/app/models/product.rb' -> `app/models/product.rb' 
    cp -vr /home/rubys/git/awdwr/data/code/e1/mailer/test . 
    `/home/rubys/git/awdwr/data/code/e1/mailer/test/functional/order_controller_test.rb' -> `./test/functional/order_controller_test.rb' 
    `/home/rubys/git/awdwr/data/code/e1/mailer/test/unit/order_mailer_test.rb' -> `./test/unit/order_mailer_test.rb' 
    `/home/rubys/git/awdwr/data/code/e1/mailer/test/fixtures/products.yml' -> `./test/fixtures/products.yml' 
    `/home/rubys/git/awdwr/data/code/e1/mailer/test/fixtures/order_mailer/confirm' -> `./test/fixtures/order_mailer/confirm' 
    `/home/rubys/git/awdwr/data/code/e1/mailer/test/fixtures/order_mailer/sent' -> `./test/fixtures/order_mailer/sent' 
    `/home/rubys/git/awdwr/data/code/e1/mailer/test/fixtures/line_items.yml' -> `./test/fixtures/line_items.yml' 
    `/home/rubys/git/awdwr/data/code/e1/mailer/test/fixtures/orders.yml' -> `./test/fixtures/orders.yml' 
    cp -vr /home/rubys/git/awdwr/data/code/e1/mailer/app/views/order_mailer app/views 
    `/home/rubys/git/awdwr/data/code/e1/mailer/app/views/order_mailer/_html_line_item.erb' -> `app/views/order_mailer/_html_line_item.erb' 
    `/home/rubys/git/awdwr/data/code/e1/mailer/app/views/order_mailer/sent.erb' -> `app/views/order_mailer/sent.erb' 
    `/home/rubys/git/awdwr/data/code/e1/mailer/app/views/order_mailer/confirm.erb' -> `app/views/order_mailer/confirm.erb' 
    `/home/rubys/git/awdwr/data/code/e1/mailer/app/views/order_mailer/_line_item.erb' -> `app/views/order_mailer/_line_item.erb' 
    `/home/rubys/git/awdwr/data/code/e1/mailer/app/views/order_mailer/survey.text.plain.erb' -> `app/views/order_mailer/survey.text.plain.erb' 
    `/home/rubys/git/awdwr/data/code/e1/mailer/app/views/order_mailer/survey.text.html.erb' -> `app/views/order_mailer/survey.text.html.erb' 
    restart 
    rake db:migrate 
    mv 001_create_products.rb 20080601000001_create_products.rb 
    mv 002_create_line_items.rb 20080601000002_create_line_items.rb 
    mv 003_create_orders.rb 20080601000003_create_orders.rb 
    mv 004_populate_data.rb 20080601000004_populate_data.rb 
    (in /home/rubys/git/awdwr/work/mailer) 
    ==  CreateProducts: migrating ================================================= 
    -- create_table(:products) 
       -> 0.0018s 
    ==  CreateProducts: migrated (0.0019s) ======================================== 
      
    ==  CreateLineItems: migrating ================================================ 
    -- create_table(:line_items) 
       -> 0.0014s 
    ==  CreateLineItems: migrated (0.0016s) ======================================= 
      
    ==  CreateOrders: migrating =================================================== 
    -- create_table(:orders) 
       -> 0.0014s 
    ==  CreateOrders: migrated (0.0015s) ========================================== 
      
    ==  PopulateData: migrating =================================================== 
    ==  PopulateData: migrated (0.0336s) ========================================== 
      
    get /test/create_order 
    
Date: Mon, 18 May 2009 08:38:11 -0400
From: orders@pragprog.com
To: dave@pragprog.com
Subject: Pragmatic Store Order Confirmation
Mime-Version: 1.0
Content-Type: text/plain; charset=utf-8
Dear Dave Thomas
Thank you for your recent order from The Pragmatic Store.
You ordered the following items:
 1 x Programming Ruby, 2nd Edition
 1 x Pragmatic Project Automation
We'll send you a separate e-mail when your order ships.
      
    
    get /test/ship_order 
    
Thank you...    
    
    rake test 
    /usr/bin/ruby1.8 -I"lib:test" "/usr/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake/rake_test_loader.rb" "test/unit/order_mailer_test.rb"  
    (in /home/rubys/git/awdwr/work/mailer) 
    Loaded suite /usr/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake/rake_test_loader 
    Started 
    .. 
    Finished in 0.057648 seconds. 
      
    2 tests, 2 assertions, 0 failures, 0 errors 
    /usr/bin/ruby1.8 -I"lib:test" "/usr/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake/rake_test_loader.rb" "test/functional/order_controller_test.rb"  
    Loaded suite /usr/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake/rake_test_loader 
    Started 
    . 
    Finished in 0.076482 seconds. 
      
    1 tests, 5 assertions, 0 failures, 0 errors 
    /usr/bin/ruby1.8 -I"lib:test" "/usr/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake/rake_test_loader.rb"   
    
      26 Active Resources 
     
    restart 
    ruby /home/rubys/git/rails/railties/bin/rails depot_client 
          create   
          create  app/controllers 
          create  app/helpers 
          create  app/models 
          create  app/views/layouts 
          create  config/environments 
          create  config/initializers 
          create  config/locales 
          create  db 
          create  doc 
          create  lib 
          create  lib/tasks 
          create  log 
          create  public/images 
          create  public/javascripts 
          create  public/stylesheets 
          create  script/performance 
          create  test/fixtures 
          create  test/functional 
          create  test/integration 
          create  test/performance 
          create  test/unit 
          create  vendor 
          create  vendor/plugins 
          create  tmp/sessions 
          create  tmp/sockets 
          create  tmp/cache 
          create  tmp/pids 
          create  Rakefile 
          create  README 
          create  app/controllers/application_controller.rb 
          create  app/helpers/application_helper.rb 
          create  config/database.yml 
          create  config/routes.rb 
          create  config/locales/en.yml 
          create  db/seeds.rb 
          create  config/initializers/backtrace_silencers.rb 
          create  config/initializers/inflections.rb 
          create  config/initializers/mime_types.rb 
          create  config/initializers/new_rails_defaults.rb 
          create  config/initializers/session_store.rb 
          create  config/environment.rb 
          create  config/boot.rb 
          create  config/environments/production.rb 
          create  config/environments/development.rb 
          create  config/environments/test.rb 
          create  script/about 
          create  script/console 
          create  script/dbconsole 
          create  script/destroy 
          create  script/generate 
          create  script/runner 
          create  script/server 
          create  script/plugin 
          create  script/performance/benchmarker 
          create  script/performance/profiler 
          create  test/test_helper.rb 
          create  test/performance/browsing_test.rb 
          create  public/404.html 
          create  public/422.html 
          create  public/500.html 
          create  public/index.html 
          create  public/favicon.ico 
          create  public/robots.txt 
          create  public/images/rails.png 
          create  public/javascripts/prototype.js 
          create  public/javascripts/effects.js 
          create  public/javascripts/dragdrop.js 
          create  public/javascripts/controls.js 
          create  public/javascripts/application.js 
          create  doc/README_FOR_APP 
          create  log/server.log 
          create  log/production.log 
          create  log/development.log 
          create  log/test.log 
    ln -s /home/rubys/git/rails vendor/rails 
    edit app/models/product.rb 
    class Product < ActiveResource::Base 
      self.site = 'http://dave:secret@localhost:3000/' 
    end 
    echo "Product.find(2).title" | ruby script/console 
    >> Product.find(2).title 
    ActiveResource::Redirection: Failed with 302 Found  => http://localhost:3000/admin/login 
    	from /home/rubys/git/awdwr/work/depot_client/vendor/rails/activeresource/lib/active_resource/connection.rb:108:in `handle_response' 
    	from /home/rubys/git/awdwr/work/depot_client/vendor/rails/activeresource/lib/active_resource/connection.rb:99:in `request' 
    	from /home/rubys/git/awdwr/work/depot_client/vendor/rails/activeresource/lib/active_resource/connection.rb:64:in `get' 
    	from /home/rubys/git/awdwr/work/depot_client/vendor/rails/activeresource/lib/active_resource/base.rb:605:in `find_single' 
    	from /home/rubys/git/awdwr/work/depot_client/vendor/rails/activeresource/lib/active_resource/base.rb:533:in `find' 
    	from (irb):1 
    >>  
    edit app/controllers/application_controller.rb 
    class ApplicationController < ActionController::Base 
      layout "store" 
      before_filter :authorize, :except => :login 
      #... 
      
      
    protected 
      def authorize 
        unless User.find_by_id(session[:user_id]) 
          if session[:user_id] != :logged_out 
            authenticate_or_request_with_http_basic('Depot') do |username, password| 
              user = User.authenticate(username, password) 
              session[:user_id] = user.id if user 
            end 
          else 
            flash[:notice] = "Please log in" 
            redirect_to :controller => 'admin', :action => 'login' 
          end 
        end 
      end 
      
      def set_locale 
        session[:locale] = params[:locale] if params[:locale] 
        I18n.locale = session[:locale] || I18n.default_locale 
      
        locale_path = "#{LOCALES_DIRECTORY}#{I18n.locale}.yml" 
      
        unless I18n.load_path.include? locale_path 
          I18n.load_path << locale_path 
          I18n.backend.send(:init_translations) 
        end 
      
      rescue Exception => err 
        logger.error err 
        flash.now[:notice] = "#{I18n.locale} translation not available" 
      
        I18n.load_path -= [locale_path] 
        I18n.locale = session[:locale] = I18n.default_locale 
      end 
    end 
    edit app/controllers/admin_controller.rb 
    class AdminController < ApplicationController 
      
      # just display the form and wait for user to 
      # enter a name and password 
      def login 
        if request.post? 
          user = User.authenticate(params[:name], params[:password]) 
          if user 
            session[:user_id] = user.id 
            redirect_to(:action => "index") 
          else 
            flash.now[:notice] = "Invalid user/password combination" 
          end 
        end 
      end 
      
      def logout 
        session[:user_id] = :logged_out 
        flash[:notice] = "Logged out" 
        redirect_to(:action => "login") 
      end 
      
      def index 
        @total_orders = Order.count 
      end 
    end 
    edit app/controllers/line_items_controller.rb 
      def create 
        params[:line_item][:order_id] ||= params[:order_id] 
        @line_item = LineItem.new(params[:line_item]) 
      
        respond_to do |format| 
          if @line_item.save 
            flash[:notice] = 'LineItem was successfully created.' 
            format.html { redirect_to(@line_item) } 
            format.xml  { render :xml => @line_item, :status => :created, 
                                 :location => @line_item } 
          else 
            format.html { render :action => "new" } 
            format.xml  { render :xml => @line_item.errors, 
                                 :status => :unprocessable_entity } 
          end 
        end 
      end 
    edit config/routes.rb 
    ActionController::Routing::Routes.draw do |map| 
      map.resources :users 
      
      map.resources :line_items 
      
      map.resources :orders, :has_many => :line_items 
      
      map.resources :products 
      
      # The priority is based upon order of creation: first created -> highest priority. 
      
      # Sample of regular route: 
      #   map.connect 'products/:id', :controller => 'catalog', :action => 'view' 
      # Keep in mind you can assign values other than :controller and :action 
      
      # Sample of named route: 
      #   map.purchase 'products/:id/purchase', :controller => 'catalog', :action => 'purchase' 
      # This route can be invoked with purchase_url(:id => product.id) 
      
      # Sample resource route (maps HTTP verbs to controller actions automatically): 
      #   map.resources :products 
      
      # Sample resource route with options: 
      #   map.resources :products, :member => { :short => :get, :toggle => :post }, :collection => { :sold => :get } 
      
      # Sample resource route with sub-resources: 
      #   map.resources :products, :has_many => [ :comments, :sales ], :has_one => :seller 
       
      # Sample resource route with more complex sub-resources 
      #   map.resources :products do |products| 
      #     products.resources :comments 
      #     products.resources :sales, :collection => { :recent => :get } 
      #   end 
      
      # Sample resource route within a namespace: 
      #   map.namespace :admin do |admin| 
      #     # Directs /admin/products/* to Admin::ProductsController (app/controllers/admin/products_controller.rb) 
      #     admin.resources :products 
      #   end 
      
      # You can have the root of your site routed with map.root -- just remember to delete public/index.html. 
      # map.root :controller => "welcome" 
      
      # See how all your routes lay out with "rake routes" 
      
      # Install the default routes as the lowest priority. 
      # Note: These default routes make all actions in every controller accessible via GET requests. You should 
      # consider removing or commenting them out if you're using named routes and resources. 
      map.connect ':controller/:action/:id' 
      map.connect ':controller/:action/:id.:format' 
    end 
    restart 
    echo "Product.find(2).title" | ruby script/console 
    >> Product.find(2).title 
    => "Pragmatic Project Automation" 
    >>  
    echo 'p = Product.find(2)
puts p.price
p.price-=5
p.save' | ruby script/console 
    >> p = Product.find(2) 
    => #<Product:0xb762a07c @prefix_options={}, @attributes={"price"=>#<BigDecimal:b7631df4,'0.2995E2',8(8)>, "created_at"=>Mon May 18 12:32:47 UTC 2009, "image_url"=>"/images/auto.jpg", "title"=>"Pragmatic Project Automation", "updated_at"=>Mon May 18 12:32:47 UTC 2009, "id"=>2, "description"=>"<p>\n       <em>Pragmatic Project Automation</em> shows you how to improve the \n       consistency and repeatability of your project's procedures using \n       automation to reduce risk and errors.\n      </p>\n      <p>\n        Simply put, we're going to put this thing called a computer to work \n        for you doing the mundane (but important) project stuff. That means \n        you'll have more time and energy to do the really \n        exciting---and difficult---stuff, like writing quality code.\n      </p>"}> 
    >> puts p.price 
    29.95 
    => nil 
    >> p.price-=5 
    => #<BigDecimal:b7622570,'0.2495E2',8(16)> 
    >> p.save 
    => true 
    >>  
    get /store 
    
 
  
  
    
    
      
            
      
Your Pragmatic Catalog 
  
     
    Pragmatic Project Automation 
    
       Pragmatic Project Automation  shows you how to improve the 
       consistency and repeatability of your project's procedures using 
       automation to reduce risk and errors.
      
      
        Simply put, we're going to put this thing called a computer to work 
        for you doing the mundane (but important) project stuff. That means 
        you'll have more time and energy to do the really 
        exciting---and difficult---stuff, like writing quality code.
      
    
   
  
     
    Pragmatic Unit Testing (C#) 
    
        Pragmatic programmers use feedback to drive their development and 
        personal processes. The most valuable feedback you can get while 
        coding comes from unit testing.
      
      
        Without good tests in place, coding can become a frustrating game of 
        "whack-a-mole." That's the carnival game where the player strikes at a 
        mechanical mole; it retreats and another mole pops up on the opposite side 
        of the field. The moles pop up and down so fast that you end up flailing 
        your mallet helplessly as the moles continue to pop up where you least 
        expect them.
      
    
   
  
     
    Pragmatic Version Control 
    
         This book is a recipe-based approach to using Subversion that will 
         get you up and running quickly---and correctly. All projects need
         version control: it's a foundational piece of any project's 
         infrastructure. Yet half of all project teams in the U.S. don't use
         any version control at all. Many others don't use it well, and end 
         up experiencing time-consuming problems.
      
    
   
     
   
     
    
    edit app/models/order.rb 
    class Order < ActiveResource::Base 
      self.site = 'http://dave:secret@localhost:3000/' 
    end 
    echo 'Order.find(1).name
Order.find(1).line_items
' | ruby script/console 
    >> Order.find(1).name 
    => "Dave Thomas" 
    >> Order.find(1).line_items 
    NoMethodError: undefined method `line_items' for #<Order:0xb75d4384> 
    	from /home/rubys/git/awdwr/work/depot_client/vendor/rails/activeresource/lib/active_resource/base.rb:1087:in `method_missing' 
    	from (irb):2 
    >>  
    ?> >>  
    edit app/models/line_item.rb 
    class LineItem < ActiveResource::Base 
      self.site = 'http://dave:secret@localhost:3000/orders/:order_id' 
    end 
    get /admin/logout 
    
HTTP Basic: Access denied.
    
    
    get /admin/login 
    
    
    post /admin/login 
    
      name => dave 
      password => secret 
     
    
You are being 
redirected .    
 
    
    get http://127.0.0.1:3000/admin 
    
 
  
  
    
    
      
            
      
Welcome 
It's Mon May 18 08:38:39 -0400 2009
We have 2 orders.
    
   
     
    
    get /orders/1/line_items.xml 
    
      <?xml version="1.0" encoding="UTF-8"?> 
      <line-items type="array"> 
        <line-item> 
          <created-at type="datetime">2009-05-18T12:33:36Z</created-at> 
          <id type="integer">1</id> 
          <order-id type="integer">1</order-id> 
          <product-id type="integer">3</product-id> 
          <quantity type="integer">1</quantity> 
          <total-price type="decimal">28.5</total-price> 
          <updated-at type="datetime">2009-05-18T12:33:36Z</updated-at> 
        </line-item> 
        <line-item> 
          <created-at type="datetime">2009-05-18T12:34:46Z</created-at> 
          <id type="integer">2</id> 
          <order-id type="integer">2</order-id> 
          <product-id type="integer">2</product-id> 
          <quantity type="integer">2</quantity> 
          <total-price type="decimal">59.9</total-price> 
          <updated-at type="datetime">2009-05-18T12:34:46Z</updated-at> 
        </line-item> 
      </line-items> 
     
    echo "LineItem.find(:all, :params => {:order_id=>1})" |ruby script/console 
    >> LineItem.find(:all, :params => {:order_id=>1}) 
    => [#<LineItem:0xb7583524 @prefix_options={:order_id=>1}, @attributes={"created_at"=>Mon May 18 12:33:36 UTC 2009, "quantity"=>1, "product_id"=>3, "updated_at"=>Mon May 18 12:33:36 UTC 2009, "total_price"=>#<BigDecimal:b75893ac,'0.285E2',8(8)>, "id"=>1}>, #<LineItem:0xb75834ac @prefix_options={:order_id=>1}, @attributes={"created_at"=>Mon May 18 12:34:46 UTC 2009, "quantity"=>2, "product_id"=>2, "updated_at"=>Mon May 18 12:34:46 UTC 2009, "total_price"=>#<BigDecimal:b7583790,'0.599E2',8(8)>, "id"=>2}>] 
    >>  
    echo 'li = LineItem.find(:all, :params => {:order_id=>1}).first
puts li.total_price
li.total_price*=0.8
li.save
li2 = LineItem.new(:order_id=>1, :product_id=>2, :quantity=>1, :total_price=>0.0)
li2.save' | ruby script/console 
    >> li = LineItem.find(:all, :params => {:order_id=>1}).first 
    => #<LineItem:0xb7637b50 @prefix_options={:order_id=>1}, @attributes={"created_at"=>Mon May 18 12:33:36 UTC 2009, "quantity"=>1, "product_id"=>3, "updated_at"=>Mon May 18 12:33:36 UTC 2009, "total_price"=>#<BigDecimal:b763b1d8,'0.285E2',8(8)>, "id"=>1}> 
    >> puts li.total_price 
    28.5 
    => nil 
    >> li.total_price*=0.8 
    => 22.8 
    >> li.save 
    => true 
    >> li2 = LineItem.new(:order_id=>1, :product_id=>2, :quantity=>1, :total_price=>0.0) 
    => #<LineItem:0xb7619470 @prefix_options={:order_id=>1}, @attributes={"quantity"=>1, "product_id"=>2, "total_price"=>0.0}> 
    >> li2.save 
    => true 
    >>  
    restart