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.6 (2007-09-24 patchlevel 111) [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: Thu May 28 14:24:16 -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/20090528172419_create_products.rb
rake db:migrate
mv 20090528172419_create_products.rb 20080601000001_create_products.rb
(in /home/rubys/git/awdwr/work/depot)
== CreateProducts: migrating =================================================
-- create_table(:products)
-> 0.0020s
== CreateProducts: migrated (0.0021s) ========================================
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/helpers/products_helper_test.rb" "test/unit/product_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.039168 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.125657 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/20090528172427_add_price_to_product.rb
cat db/migrate/20090528172427_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/20090528172427_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 20090528172427_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.0012s
== AddPriceToProduct: migrated (0.0013s) =====================================
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/helpers/products_helper_test.rb" "test/unit/product_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.036459 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.135985 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.0173s) ===========================================
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/20090528172439_create_sessions.rb
rake db:migrate
mv 20090528172439_create_sessions.rb 20080601000004_create_sessions.rb
(in /home/rubys/git/awdwr/work/depot)
== CreateSessions: migrating =================================================
-- create_table(:sessions)
-> 0.0019s
-- add_index(:sessions, :session_id)
-> 0.0005s
-- add_index(:sessions, :updated_at)
-> 0.0004s
== CreateSessions: migrated (0.0032s) ========================================
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 => '56c6bcc40b97b3e997660e0743a58786338b8fb13b2a45817a82e3112e39f051fcd01246f95a635b43ce7b7974af16628bc557300ad3c1b2e42a49f4ec440967'
}
# 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:0xb6ab6394></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:812:in `send'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:812: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'
/home/rubys/git/awdwr/work/depot/vendor/rails/activesupport/lib/active_support/core_ext/benchmark.rb:10: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:154:in `perform_action'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:480:in `send'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:480: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:373:in `action'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:381: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:150: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:45: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/chunked.rb:15:in `call'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/handler/mongrel.rb:61:in `process'
/usr/lib/ruby/1.8/mongrel.rb:159:in `process_client'
/usr/lib/ruby/1.8/mongrel.rb:158:in `each'
/usr/lib/ruby/1.8/mongrel.rb:158:in `process_client'
/usr/lib/ruby/1.8/mongrel.rb:285:in `run'
/usr/lib/ruby/1.8/mongrel.rb:285:in `initialize'
/usr/lib/ruby/1.8/mongrel.rb:285:in `new'
/usr/lib/ruby/1.8/mongrel.rb:285:in `run'
/usr/lib/ruby/1.8/mongrel.rb:268:in `initialize'
/usr/lib/ruby/1.8/mongrel.rb:268:in `new'
/usr/lib/ruby/1.8/mongrel.rb:268:in `run'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/handler/mongrel.rb:34: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:2334:in `restart_server'
makedepot.rb:346
makedepot.rb:2413:in `call'
makedepot.rb:2413
makedepot.rb:2409:in `each'
makedepot.rb:2409
makedepot.rb:2372
makedepot.rb:2345</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:812:in `send'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:812: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'
/home/rubys/git/awdwr/work/depot/vendor/rails/activesupport/lib/active_support/core_ext/benchmark.rb:10: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:154:in `perform_action'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:480:in `send'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:480: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:373:in `action'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:381: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:150: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:45: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/chunked.rb:15:in `call'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/handler/mongrel.rb:61:in `process'
/usr/lib/ruby/1.8/mongrel.rb:159:in `process_client'
/usr/lib/ruby/1.8/mongrel.rb:158:in `each'
/usr/lib/ruby/1.8/mongrel.rb:158:in `process_client'
/usr/lib/ruby/1.8/mongrel.rb:285:in `run'
/usr/lib/ruby/1.8/mongrel.rb:285:in `initialize'
/usr/lib/ruby/1.8/mongrel.rb:285:in `new'
/usr/lib/ruby/1.8/mongrel.rb:285:in `run'
/usr/lib/ruby/1.8/mongrel.rb:268:in `initialize'
/usr/lib/ruby/1.8/mongrel.rb:268:in `new'
/usr/lib/ruby/1.8/mongrel.rb:268:in `run'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/handler/mongrel.rb:34: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:812:in `send'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:812: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'
/home/rubys/git/awdwr/work/depot/vendor/rails/activesupport/lib/active_support/core_ext/benchmark.rb:10: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:154:in `perform_action'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:480:in `send'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:480: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:373:in `action'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:381: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:150: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:45: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/chunked.rb:15:in `call'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/handler/mongrel.rb:61:in `process'
/usr/lib/ruby/1.8/mongrel.rb:159:in `process_client'
/usr/lib/ruby/1.8/mongrel.rb:158:in `each'
/usr/lib/ruby/1.8/mongrel.rb:158:in `process_client'
/usr/lib/ruby/1.8/mongrel.rb:285:in `run'
/usr/lib/ruby/1.8/mongrel.rb:285:in `initialize'
/usr/lib/ruby/1.8/mongrel.rb:285:in `new'
/usr/lib/ruby/1.8/mongrel.rb:285:in `run'
/usr/lib/ruby/1.8/mongrel.rb:268:in `initialize'
/usr/lib/ruby/1.8/mongrel.rb:268:in `new'
/usr/lib/ruby/1.8/mongrel.rb:268:in `run'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/handler/mongrel.rb:34: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:2334:in `restart_server'
makedepot.rb:346
makedepot.rb:2413:in `call'
makedepot.rb:2413
makedepot.rb:2409:in `each'
makedepot.rb:2409
/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:2372
/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:2345</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
1 × 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:1600:in `find_one'
/home/rubys/git/awdwr/work/depot/vendor/rails/activerecord/lib/active_record/base.rb:1583:in `find_from_ids'
/home/rubys/git/awdwr/work/depot/vendor/rails/activerecord/lib/active_record/base.rb:627: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:812:in `send'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:812: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'
/home/rubys/git/awdwr/work/depot/vendor/rails/activesupport/lib/active_support/core_ext/benchmark.rb:10: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:154:in `perform_action'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:480:in `send'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:480: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:373:in `action'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:381: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:150: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:45: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/chunked.rb:15:in `call'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/handler/mongrel.rb:61:in `process'
/usr/lib/ruby/1.8/mongrel.rb:159:in `process_client'
/usr/lib/ruby/1.8/mongrel.rb:158:in `each'
/usr/lib/ruby/1.8/mongrel.rb:158:in `process_client'
/usr/lib/ruby/1.8/mongrel.rb:285:in `run'
/usr/lib/ruby/1.8/mongrel.rb:285:in `initialize'
/usr/lib/ruby/1.8/mongrel.rb:285:in `new'
/usr/lib/ruby/1.8/mongrel.rb:285:in `run'
/usr/lib/ruby/1.8/mongrel.rb:268:in `initialize'
/usr/lib/ruby/1.8/mongrel.rb:268:in `new'
/usr/lib/ruby/1.8/mongrel.rb:268:in `run'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/handler/mongrel.rb:34: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:2334:in `restart_server'
makedepot.rb:421
makedepot.rb:2413:in `call'
makedepot.rb:2413
makedepot.rb:2409:in `each'
makedepot.rb:2409
makedepot.rb:2372
makedepot.rb:2345
/home/rubys/git/awdwr/work/depot/vendor/rails/activerecord/lib/active_record/base.rb:1600:in `find_one'
/home/rubys/git/awdwr/work/depot/vendor/rails/activerecord/lib/active_record/base.rb:1583:in `find_from_ids'
/home/rubys/git/awdwr/work/depot/vendor/rails/activerecord/lib/active_record/base.rb:627: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:812:in `send'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:812: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'
/home/rubys/git/awdwr/work/depot/vendor/rails/activesupport/lib/active_support/core_ext/benchmark.rb:10: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:154:in `perform_action'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:480:in `send'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:480: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:373:in `action'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:381: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:150: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:45: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/chunked.rb:15:in `call'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/handler/mongrel.rb:61:in `process'
/usr/lib/ruby/1.8/mongrel.rb:159:in `process_client'
/usr/lib/ruby/1.8/mongrel.rb:158:in `each'
/usr/lib/ruby/1.8/mongrel.rb:158:in `process_client'
/usr/lib/ruby/1.8/mongrel.rb:285:in `run'
/usr/lib/ruby/1.8/mongrel.rb:285:in `initialize'
/usr/lib/ruby/1.8/mongrel.rb:285:in `new'
/usr/lib/ruby/1.8/mongrel.rb:285:in `run'
/usr/lib/ruby/1.8/mongrel.rb:268:in `initialize'
/usr/lib/ruby/1.8/mongrel.rb:268:in `new'
/usr/lib/ruby/1.8/mongrel.rb:268:in `run'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/handler/mongrel.rb:34: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:1600:in `find_one'
/home/rubys/git/awdwr/work/depot/vendor/rails/activerecord/lib/active_record/base.rb:1583:in `find_from_ids'
/home/rubys/git/awdwr/work/depot/vendor/rails/activerecord/lib/active_record/base.rb:627: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:812:in `send'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:812: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'
/home/rubys/git/awdwr/work/depot/vendor/rails/activesupport/lib/active_support/core_ext/benchmark.rb:10: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:154:in `perform_action'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:480:in `send'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:480: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:373:in `action'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:381: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:150: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:45: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/chunked.rb:15:in `call'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/handler/mongrel.rb:61:in `process'
/usr/lib/ruby/1.8/mongrel.rb:159:in `process_client'
/usr/lib/ruby/1.8/mongrel.rb:158:in `each'
/usr/lib/ruby/1.8/mongrel.rb:158:in `process_client'
/usr/lib/ruby/1.8/mongrel.rb:285:in `run'
/usr/lib/ruby/1.8/mongrel.rb:285:in `initialize'
/usr/lib/ruby/1.8/mongrel.rb:285:in `new'
/usr/lib/ruby/1.8/mongrel.rb:285:in `run'
/usr/lib/ruby/1.8/mongrel.rb:268:in `initialize'
/usr/lib/ruby/1.8/mongrel.rb:268:in `new'
/usr/lib/ruby/1.8/mongrel.rb:268:in `run'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/handler/mongrel.rb:34: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:2334:in `restart_server'
makedepot.rb:421
makedepot.rb:2413:in `call'
makedepot.rb:2413
makedepot.rb:2409:in `each'
makedepot.rb:2409
/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:2372
/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:2345
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-28 13:24:46) [GET]
Parameters: {"id"=>"wibble"}
*[4;36;1mProduct Load (0.2ms)*[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 16ms (DB: 1) | 302 Found [http://127.0.0.1/store/add_to_cart/wibble]
Processing StoreController#index (for 127.0.0.1 at 2009-05-28 13:24:46) [GET]
*[4;35;1mProduct Load (1.1ms)*[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 75ms (View: 67, DB: 2) | 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
<"$88.40"> expected but was
<"$29.95">.
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:167
./checkdepot.rb:18:in `instance_eval'
./checkdepot.rb:18:in `test_8.5_Iteration_C4:_Finishing_the_Cart'
/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'
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
<"$88.40"> expected but was
<"$29.95">.
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:173
./checkdepot.rb:18:in `instance_eval'
./checkdepot.rb:18:in `test_9.1_Iteration_D1:_Moving_the_Cart'
/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'
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
<"$28.50"> expected but was
<"$0.00">.
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:179
./checkdepot.rb:18:in `instance_eval'
./checkdepot.rb:18:in `test_9.5_Iteration_D5:_Degrading_If_Javascript_Is_Disabled'
/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'
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
<"Thank you for your order"> expected but was
<"Your cart is empty">.
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:186
./checkdepot.rb:18:in `instance_eval'
./checkdepot.rb:18:in `test_10.1_Iteration_E1:_Capturing_an_Order'
/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 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/20090528172450_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/20090528172451_create_line_items.rb
edit db/migrate/20090528172450_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/20090528172451_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 20090528172450_create_orders.rb 20080601000005_create_orders.rb
mv 20090528172451_create_line_items.rb 20080601000006_create_line_items.rb
(in /home/rubys/git/awdwr/work/depot)
== CreateOrders: migrating ===================================================
-- create_table(:orders)
-> 0.0022s
== CreateOrders: migrated (0.0023s) ==========================================
== CreateLineItems: migrating ================================================
-- create_table(:line_items)
-> 0.0021s
== CreateLineItems: migrated (0.0022s) =======================================
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
You are being
redirected .
get http://127.0.0.1:3000/store
Pragmatic Bookshelf
Your cart is 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.
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
You are being
redirected .
sqlite3> select * from orders
sqlite3> select * from line_items
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/20090528172454_create_users.rb
restart
cat db/migrate/20090528172454_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 20090528172454_create_users.rb 20080601000007_create_users.rb
(in /home/rubys/git/awdwr/work/depot)
== CreateUsers: migrating ====================================================
-- create_table(:users)
-> 0.0022s
== CreateUsers: migrated (0.0024s) ===========================================
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
Your cart is empty
Listing users
New user
get /users/new
post /users
user[name] => dave
user[password] => secret
user[password_confirmation] => 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 = c962b1dd88ee3c1dc48914ccfa2887663e97c8d7
salt = -6122506180.547117527174016
created_at = 2009-05-28 17:24:57.768294
updated_at = 2009-05-28 17:24:57.768294
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 Thu May 28 13:25:00 -0400 2009
We have 0 orders.
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 Thu May 28 13:25:03 -0400 2009
We have 0 orders.
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__615068108_0'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_view/template/template.rb:28:in `send'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_view/template/template.rb:28: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'
/home/rubys/git/awdwr/work/depot/vendor/rails/activesupport/lib/active_support/core_ext/benchmark.rb:10: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:807:in `default_render'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:817: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'
/home/rubys/git/awdwr/work/depot/vendor/rails/activesupport/lib/active_support/core_ext/benchmark.rb:10: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:154:in `perform_action'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:480:in `send'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:480: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:373:in `action'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:381: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:150: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:45: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/chunked.rb:15:in `call'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/handler/mongrel.rb:61:in `process'
/usr/lib/ruby/1.8/mongrel.rb:159:in `process_client'
/usr/lib/ruby/1.8/mongrel.rb:158:in `each'
/usr/lib/ruby/1.8/mongrel.rb:158:in `process_client'
/usr/lib/ruby/1.8/mongrel.rb:285:in `run'
/usr/lib/ruby/1.8/mongrel.rb:285:in `initialize'
/usr/lib/ruby/1.8/mongrel.rb:285:in `new'
/usr/lib/ruby/1.8/mongrel.rb:285:in `run'
/usr/lib/ruby/1.8/mongrel.rb:268:in `initialize'
/usr/lib/ruby/1.8/mongrel.rb:268:in `new'
/usr/lib/ruby/1.8/mongrel.rb:268:in `run'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/handler/mongrel.rb:34: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:2334:in `restart_server'
makedepot.rb:999
makedepot.rb:2413:in `call'
makedepot.rb:2413
makedepot.rb:2409:in `each'
makedepot.rb:2409
makedepot.rb:2372
makedepot.rb:2345</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__615068108_0'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_view/template/template.rb:28:in `send'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_view/template/template.rb:28: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'
/home/rubys/git/awdwr/work/depot/vendor/rails/activesupport/lib/active_support/core_ext/benchmark.rb:10: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:807:in `default_render'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:817: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'
/home/rubys/git/awdwr/work/depot/vendor/rails/activesupport/lib/active_support/core_ext/benchmark.rb:10: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:154:in `perform_action'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:480:in `send'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:480: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:373:in `action'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:381: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:150: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:45: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/chunked.rb:15:in `call'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/handler/mongrel.rb:61:in `process'
/usr/lib/ruby/1.8/mongrel.rb:159:in `process_client'
/usr/lib/ruby/1.8/mongrel.rb:158:in `each'
/usr/lib/ruby/1.8/mongrel.rb:158:in `process_client'
/usr/lib/ruby/1.8/mongrel.rb:285:in `run'
/usr/lib/ruby/1.8/mongrel.rb:285:in `initialize'
/usr/lib/ruby/1.8/mongrel.rb:285:in `new'
/usr/lib/ruby/1.8/mongrel.rb:285:in `run'
/usr/lib/ruby/1.8/mongrel.rb:268:in `initialize'
/usr/lib/ruby/1.8/mongrel.rb:268:in `new'
/usr/lib/ruby/1.8/mongrel.rb:268:in `run'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/handler/mongrel.rb:34: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__615068108_0'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_view/template/template.rb:28:in `send'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_view/template/template.rb:28: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'
/home/rubys/git/awdwr/work/depot/vendor/rails/activesupport/lib/active_support/core_ext/benchmark.rb:10: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:807:in `default_render'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:817: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'
/home/rubys/git/awdwr/work/depot/vendor/rails/activesupport/lib/active_support/core_ext/benchmark.rb:10: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:154:in `perform_action'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:480:in `send'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:480: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:373:in `action'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:381: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:150: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:45: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/chunked.rb:15:in `call'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/handler/mongrel.rb:61:in `process'
/usr/lib/ruby/1.8/mongrel.rb:159:in `process_client'
/usr/lib/ruby/1.8/mongrel.rb:158:in `each'
/usr/lib/ruby/1.8/mongrel.rb:158:in `process_client'
/usr/lib/ruby/1.8/mongrel.rb:285:in `run'
/usr/lib/ruby/1.8/mongrel.rb:285:in `initialize'
/usr/lib/ruby/1.8/mongrel.rb:285:in `new'
/usr/lib/ruby/1.8/mongrel.rb:285:in `run'
/usr/lib/ruby/1.8/mongrel.rb:268:in `initialize'
/usr/lib/ruby/1.8/mongrel.rb:268:in `new'
/usr/lib/ruby/1.8/mongrel.rb:268:in `run'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/handler/mongrel.rb:34: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:2334:in `restart_server'
makedepot.rb:999
makedepot.rb:2413:in `call'
makedepot.rb:2413
makedepot.rb:2409:in `each'
makedepot.rb:2409
/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:2372
/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:2345</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__621373848_0'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_view/template/template.rb:28:in `send'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_view/template/template.rb:28: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'
/home/rubys/git/awdwr/work/depot/vendor/rails/activesupport/lib/active_support/core_ext/benchmark.rb:10: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:130:in `send'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/mime_responds.rb:130:in `custom'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/mime_responds.rb:174:in `call'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/mime_responds.rb:174:in `respond'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/mime_responds.rb:168:in `each'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/mime_responds.rb:168:in `respond'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/mime_responds.rb:100: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:812:in `send'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:812: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'
/home/rubys/git/awdwr/work/depot/vendor/rails/activesupport/lib/active_support/core_ext/benchmark.rb:10: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:154:in `perform_action'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:480:in `send'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:480: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:373:in `action'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:381: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:150: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:45: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/chunked.rb:15:in `call'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/handler/mongrel.rb:61:in `process'
/usr/lib/ruby/1.8/mongrel.rb:159:in `process_client'
/usr/lib/ruby/1.8/mongrel.rb:158:in `each'
/usr/lib/ruby/1.8/mongrel.rb:158:in `process_client'
/usr/lib/ruby/1.8/mongrel.rb:285:in `run'
/usr/lib/ruby/1.8/mongrel.rb:285:in `initialize'
/usr/lib/ruby/1.8/mongrel.rb:285:in `new'
/usr/lib/ruby/1.8/mongrel.rb:285:in `run'
/usr/lib/ruby/1.8/mongrel.rb:268:in `initialize'
/usr/lib/ruby/1.8/mongrel.rb:268:in `new'
/usr/lib/ruby/1.8/mongrel.rb:268:in `run'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/handler/mongrel.rb:34: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:2334:in `restart_server'
makedepot.rb:999
makedepot.rb:2413:in `call'
makedepot.rb:2413
makedepot.rb:2409:in `each'
makedepot.rb:2409
makedepot.rb:2372
makedepot.rb:2345</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__621373848_0'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_view/template/template.rb:28:in `send'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_view/template/template.rb:28: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'
/home/rubys/git/awdwr/work/depot/vendor/rails/activesupport/lib/active_support/core_ext/benchmark.rb:10: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:130:in `send'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/mime_responds.rb:130:in `custom'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/mime_responds.rb:174:in `call'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/mime_responds.rb:174:in `respond'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/mime_responds.rb:168:in `each'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/mime_responds.rb:168:in `respond'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/mime_responds.rb:100: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:812:in `send'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:812: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'
/home/rubys/git/awdwr/work/depot/vendor/rails/activesupport/lib/active_support/core_ext/benchmark.rb:10: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:154:in `perform_action'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:480:in `send'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:480: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:373:in `action'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:381: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:150: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:45: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/chunked.rb:15:in `call'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/handler/mongrel.rb:61:in `process'
/usr/lib/ruby/1.8/mongrel.rb:159:in `process_client'
/usr/lib/ruby/1.8/mongrel.rb:158:in `each'
/usr/lib/ruby/1.8/mongrel.rb:158:in `process_client'
/usr/lib/ruby/1.8/mongrel.rb:285:in `run'
/usr/lib/ruby/1.8/mongrel.rb:285:in `initialize'
/usr/lib/ruby/1.8/mongrel.rb:285:in `new'
/usr/lib/ruby/1.8/mongrel.rb:285:in `run'
/usr/lib/ruby/1.8/mongrel.rb:268:in `initialize'
/usr/lib/ruby/1.8/mongrel.rb:268:in `new'
/usr/lib/ruby/1.8/mongrel.rb:268:in `run'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/handler/mongrel.rb:34: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__621373848_0'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_view/template/template.rb:28:in `send'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_view/template/template.rb:28: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'
/home/rubys/git/awdwr/work/depot/vendor/rails/activesupport/lib/active_support/core_ext/benchmark.rb:10: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:130:in `send'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/mime_responds.rb:130:in `custom'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/mime_responds.rb:174:in `call'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/mime_responds.rb:174:in `respond'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/mime_responds.rb:168:in `each'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/mime_responds.rb:168:in `respond'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/mime_responds.rb:100: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:812:in `send'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:812: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'
/home/rubys/git/awdwr/work/depot/vendor/rails/activesupport/lib/active_support/core_ext/benchmark.rb:10: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:154:in `perform_action'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:480:in `send'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:480: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:373:in `action'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:381: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:150: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:45: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/chunked.rb:15:in `call'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/handler/mongrel.rb:61:in `process'
/usr/lib/ruby/1.8/mongrel.rb:159:in `process_client'
/usr/lib/ruby/1.8/mongrel.rb:158:in `each'
/usr/lib/ruby/1.8/mongrel.rb:158:in `process_client'
/usr/lib/ruby/1.8/mongrel.rb:285:in `run'
/usr/lib/ruby/1.8/mongrel.rb:285:in `initialize'
/usr/lib/ruby/1.8/mongrel.rb:285:in `new'
/usr/lib/ruby/1.8/mongrel.rb:285:in `run'
/usr/lib/ruby/1.8/mongrel.rb:268:in `initialize'
/usr/lib/ruby/1.8/mongrel.rb:268:in `new'
/usr/lib/ruby/1.8/mongrel.rb:268:in `run'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/handler/mongrel.rb:34: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:2334:in `restart_server'
makedepot.rb:999
makedepot.rb:2413:in `call'
makedepot.rb:2413
makedepot.rb:2409:in `each'
makedepot.rb:2409
/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:2372
/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:2345</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 Thu May 28 13:25:04 -0400 2009
We have 0 orders.
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:b7820a20,'0.0',4(8)>>
>>
12.1 Generating the XML Feed
</<email>customer@example.com<\/email>/> expected but was
<"class Product < ActiveRecord::Base">.
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:214
./checkdepot.rb:18:in `instance_eval'
./checkdepot.rb:18:in `test_12.1_Generating_the_XML_Feed'
/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'
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-28 17:24:34.797794
updated_at = 2009-05-28 17:24:34.797794
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-28 17:24:34.801154
updated_at = 2009-05-28 17:24:34.801154
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-28 17:24:34.804373
updated_at = 2009-05-28 17:24:34.804373
price = 27.75
sqlite3> select * from line_items
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?1243531492" media="all" rel="stylesheet" type="text/css" />
<!-- END:stylesheet -->
<script src="/javascripts/prototype.js?1243531457" type="text/javascript"></script>
<script src="/javascripts/effects.js?1243531457" type="text/javascript"></script>
<script src="/javascripts/dragdrop.js?1243531457" type="text/javascript"></script>
<script src="/javascripts/controls.js?1243531457" type="text/javascript"></script>
<script src="/javascripts/application.js?1243531457" type="text/javascript"></script>
</head>
<!-- END:jit -->
<body id="store">
<div id="banner">
<img alt="Logo" src="/images/logo.png?1243531474" />
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>
</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_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-28T17:24:34Z</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-28T17:24:34Z</updated-at>
<orders type="array"/>
</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
<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
Info#who_bought
</h1>
<p>
Showing <i>/home/rubys/git/awdwr/work/depot/app/views/info/who_bought.atom.builder</i> where line <b>#3</b> raised:
<pre><code>You have a nil object when you didn't expect it!
The error occurred while evaluating nil.created_at</code></pre>
</p>
<p>Extracted source (around line <b>#3</b>):
<pre><code>1: atom_feed do |feed|
2: feed.title "Who bought #{@product.title}"
3: feed.updated @orders.first.created_at
4:
5: for order in @orders
6: feed.entry(order) do |entry|
</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/info/who_bought.atom.builder:3:in `_render_template__903346904__620910178_0'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_view/helpers/atom_feed_helper.rb:121:in `atom_feed'
/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/actionpack/lib/action_view/helpers/atom_feed_helper.rb:116:in `atom_feed'
/home/rubys/git/awdwr/work/depot/app/views/info/who_bought.atom.builder:1:in `_render_template__903346904__620910178_0'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_view/template/template.rb:28:in `send'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_view/template/template.rb:28: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:113: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'
/home/rubys/git/awdwr/work/depot/vendor/rails/activesupport/lib/active_support/core_ext/benchmark.rb:10: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/app/controllers/info_controller.rb:8:in `who_bought'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/mime_responds.rb:130:in `call'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/mime_responds.rb:130:in `custom'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/mime_responds.rb:174:in `call'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/mime_responds.rb:174:in `respond'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/mime_responds.rb:168:in `each'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/mime_responds.rb:168:in `respond'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/mime_responds.rb:100:in `respond_to'
/home/rubys/git/awdwr/work/depot/app/controllers/info_controller.rb:6:in `who_bought'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:812:in `send'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:812: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'
/home/rubys/git/awdwr/work/depot/vendor/rails/activesupport/lib/active_support/core_ext/benchmark.rb:10: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:154:in `perform_action'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:480:in `send'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:480: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:373:in `action'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:381: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:150: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:45: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/chunked.rb:15:in `call'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/handler/mongrel.rb:61:in `process'
/usr/lib/ruby/1.8/mongrel.rb:159:in `process_client'
/usr/lib/ruby/1.8/mongrel.rb:158:in `each'
/usr/lib/ruby/1.8/mongrel.rb:158:in `process_client'
/usr/lib/ruby/1.8/mongrel.rb:285:in `run'
/usr/lib/ruby/1.8/mongrel.rb:285:in `initialize'
/usr/lib/ruby/1.8/mongrel.rb:285:in `new'
/usr/lib/ruby/1.8/mongrel.rb:285:in `run'
/usr/lib/ruby/1.8/mongrel.rb:268:in `initialize'
/usr/lib/ruby/1.8/mongrel.rb:268:in `new'
/usr/lib/ruby/1.8/mongrel.rb:268:in `run'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/handler/mongrel.rb:34: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:2334:in `restart_server'
makedepot.rb:1190
makedepot.rb:2413:in `call'
makedepot.rb:2413
makedepot.rb:2409:in `each'
makedepot.rb:2409
makedepot.rb:2372
makedepot.rb:2345</code></pre>
</div>
<div id="Framework-Trace" style="display: none;">
<pre><code>/home/rubys/git/awdwr/work/depot/app/views/info/who_bought.atom.builder:3:in `_render_template__903346904__620910178_0'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_view/helpers/atom_feed_helper.rb:121:in `atom_feed'
/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/actionpack/lib/action_view/helpers/atom_feed_helper.rb:116:in `atom_feed'
/home/rubys/git/awdwr/work/depot/app/views/info/who_bought.atom.builder:1:in `_render_template__903346904__620910178_0'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_view/template/template.rb:28:in `send'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_view/template/template.rb:28: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:113: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'
/home/rubys/git/awdwr/work/depot/vendor/rails/activesupport/lib/active_support/core_ext/benchmark.rb:10: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/app/controllers/info_controller.rb:8:in `who_bought'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/mime_responds.rb:130:in `call'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/mime_responds.rb:130:in `custom'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/mime_responds.rb:174:in `call'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/mime_responds.rb:174:in `respond'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/mime_responds.rb:168:in `each'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/mime_responds.rb:168:in `respond'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/mime_responds.rb:100:in `respond_to'
/home/rubys/git/awdwr/work/depot/app/controllers/info_controller.rb:6:in `who_bought'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:812:in `send'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:812: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'
/home/rubys/git/awdwr/work/depot/vendor/rails/activesupport/lib/active_support/core_ext/benchmark.rb:10: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:154:in `perform_action'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:480:in `send'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:480: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:373:in `action'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:381: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:150: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:45: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/chunked.rb:15:in `call'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/handler/mongrel.rb:61:in `process'
/usr/lib/ruby/1.8/mongrel.rb:159:in `process_client'
/usr/lib/ruby/1.8/mongrel.rb:158:in `each'
/usr/lib/ruby/1.8/mongrel.rb:158:in `process_client'
/usr/lib/ruby/1.8/mongrel.rb:285:in `run'
/usr/lib/ruby/1.8/mongrel.rb:285:in `initialize'
/usr/lib/ruby/1.8/mongrel.rb:285:in `new'
/usr/lib/ruby/1.8/mongrel.rb:285:in `run'
/usr/lib/ruby/1.8/mongrel.rb:268:in `initialize'
/usr/lib/ruby/1.8/mongrel.rb:268:in `new'
/usr/lib/ruby/1.8/mongrel.rb:268:in `run'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/handler/mongrel.rb:34: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/info/who_bought.atom.builder:3:in `_render_template__903346904__620910178_0'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_view/helpers/atom_feed_helper.rb:121:in `atom_feed'
/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/actionpack/lib/action_view/helpers/atom_feed_helper.rb:116:in `atom_feed'
/home/rubys/git/awdwr/work/depot/app/views/info/who_bought.atom.builder:1:in `_render_template__903346904__620910178_0'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_view/template/template.rb:28:in `send'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_view/template/template.rb:28: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:113: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'
/home/rubys/git/awdwr/work/depot/vendor/rails/activesupport/lib/active_support/core_ext/benchmark.rb:10: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/app/controllers/info_controller.rb:8:in `who_bought'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/mime_responds.rb:130:in `call'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/mime_responds.rb:130:in `custom'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/mime_responds.rb:174:in `call'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/mime_responds.rb:174:in `respond'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/mime_responds.rb:168:in `each'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/mime_responds.rb:168:in `respond'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/mime_responds.rb:100:in `respond_to'
/home/rubys/git/awdwr/work/depot/app/controllers/info_controller.rb:6:in `who_bought'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:812:in `send'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:812: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'
/home/rubys/git/awdwr/work/depot/vendor/rails/activesupport/lib/active_support/core_ext/benchmark.rb:10: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:154:in `perform_action'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:480:in `send'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:480: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:373:in `action'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_controller/base/base.rb:381: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:150: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:45: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/chunked.rb:15:in `call'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/handler/mongrel.rb:61:in `process'
/usr/lib/ruby/1.8/mongrel.rb:159:in `process_client'
/usr/lib/ruby/1.8/mongrel.rb:158:in `each'
/usr/lib/ruby/1.8/mongrel.rb:158:in `process_client'
/usr/lib/ruby/1.8/mongrel.rb:285:in `run'
/usr/lib/ruby/1.8/mongrel.rb:285:in `initialize'
/usr/lib/ruby/1.8/mongrel.rb:285:in `new'
/usr/lib/ruby/1.8/mongrel.rb:285:in `run'
/usr/lib/ruby/1.8/mongrel.rb:268:in `initialize'
/usr/lib/ruby/1.8/mongrel.rb:268:in `new'
/usr/lib/ruby/1.8/mongrel.rb:268:in `run'
/home/rubys/git/awdwr/work/depot/vendor/rails/actionpack/lib/action_dispatch/vendor/rack-1.1.pre/rack/handler/mongrel.rb:34: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:2334:in `restart_server'
makedepot.rb:1190
makedepot.rb:2413:in `call'
makedepot.rb:2413
makedepot.rb:2409:in `each'
makedepot.rb:2409
/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:2372
/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:2345</code></pre>
</div>
</div>
<h2 style="margin-top: 30px">Request</h2>
<p><b>Parameters</b>: <pre>{"format"=>"atom",
"id"=>"3"}</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/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":{"image_url":"/images/svn.jpg","updated_at":"2009-05-28T17:24:34Z","title":"Pragmatic Version Control","price":28.5,"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>","orders":[],"created_at":"2009-05-28T17:24:34Z"}}
mv app/controllers/info_controller.save app/controllers/info_controller.rb
rake doc:app
rm -r doc/app
README_FOR_APP:
application_helper.rb: m
store_helper.rb: m.
info_helper.rb: m
admin_helper.rb: m
line_items_helper.rb: m
orders_helper.rb: m
users_helper.rb: m
products_helper.rb: m
users_controller.rb: c.......
store_controller.rb: c........
line_items_controller.rb: c.......
application_controller.rb: c.
info_controller.rb: c..
admin_controller.rb: c...
products_controller.rb: c.......
orders_controller.rb: c.......
cart.rb: c....
cart_item.rb: c....
user.rb: c.......
product.rb: c..
line_item.rb: c.
order.rb: c.
Generating HTML...
(in /home/rubys/git/awdwr/work/depot)
Files: 23
Classes: 14
Modules: 8
Methods: 62
Elapsed: 0.926s
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
You are being
redirected .
get http://127.0.0.1:3000/store
Your cart is empty
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/save_order
get /store/save_order
post /store/save_order
order[address] => 123 Main St., Anytown USA
order[email] => juser@hotmail.com
order[pay_type] => check
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.030017 seconds.
1) Error:
test_the_truth(ProductTest):
ActiveRecord::StatementInvalid: SQLite3::SQLException: no such table: line_items: DELETE FROM "line_items" 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.050443 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/helpers/products_helper_test.rb" "test/unit/helpers/info_helper_test.rb" "test/unit/helpers/admin_helper_test.rb" "test/unit/helpers/line_items_helper_test.rb" "test/unit/helpers/orders_helper_test.rb" "test/unit/helpers/users_helper_test.rb" "test/unit/helpers/store_helper_test.rb" "test/unit/product_test.rb" "test/unit/user_test.rb" "test/unit/line_item_test.rb" "test/unit/order_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.054082 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/helpers/products_helper_test.rb" "test/unit/helpers/info_helper_test.rb" "test/unit/helpers/admin_helper_test.rb" "test/unit/helpers/line_items_helper_test.rb" "test/unit/helpers/orders_helper_test.rb" "test/unit/helpers/users_helper_test.rb" "test/unit/helpers/store_helper_test.rb" "test/unit/product_test.rb" "test/unit/user_test.rb" "test/unit/line_item_test.rb" "test/unit/order_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.095465 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.056426 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.058696 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.120991 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:245
./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/#{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@example.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@example.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.209069 seconds.
1) Failure:
test_buying_a_product(UserStoriesTest) [test/integration/user_stories_test.rb:35]:
Expected response to be a <:success>, but was <302>
1 tests, 6 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@example.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/#{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
F.
Finished in 0.373831 seconds.
1) Failure:
test_buying_a_product(DslUserStoriesTest)
[test/integration/dsl_user_stories_test.rb:90:in `checks_out'
test/integration/dsl_user_stories_test.rb:46:in `test_buying_a_product']:
Expected response to be a <:success>, but was <302>
2 tests, 36 assertions, 1 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@example.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 2.076933 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.180000 0.010000 0.190000 ( 0.192746)
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
73.08 3.80 3.80 1 3800.00 5060.00 Integer#times
24.23 5.06 1.26 100000 0.01 0.01 Math.sin
1.35 5.13 0.07 4 17.50 17.50 Array#select
0.58 5.16 0.03 5 6.00 10.00 Array#map
0.38 5.18 0.02 757 0.03 0.03 String#to_s
0.19 5.19 0.01 8 1.25 1.25 ActiveSupport::Dependencies.qualified_const_defined?
0.19 5.20 0.01 1 10.00 40.00 Kernel.load_without_new_constant_marking
0.00 5.20 0.00 1 0.00 5200.00 Object#profile_me
0.00 5.20 0.00 1 0.00 0.00 ActiveRecord::DynamicFinderMatch#initialize
0.00 5.20 0.00 1 0.00 0.00 Digest::Class#hexdigest
0.00 5.20 0.00 1 0.00 0.00 Digest::Instance.digest
0.00 5.20 0.00 1 0.00 140.00 ActiveSupport::Dependencies::ModuleConstMissing.const_missing
0.00 5.20 0.00 2 0.00 0.00 Kernel.instance_variable_set
0.00 5.20 0.00 2 0.00 0.00 Kernel.==
0.00 5.20 0.00 5 0.00 0.00 Array#pop
0.00 5.20 0.00 1 0.00 0.00 Kernel.require
0.00 5.20 0.00 2 0.00 0.00 ActiveSupport::Dependencies.load?
0.00 5.20 0.00 3 0.00 0.00 Module#===
0.00 5.20 0.00 1 0.00 0.00 NilClass#nil?
0.00 5.20 0.00 2 0.00 0.00 ActiveSupport::Dependencies.autoloaded_constants
0.00 5.20 0.00 2 0.00 0.00 Array#blank?
0.00 5.20 0.00 2 0.00 0.00 ActiveSupport::Dependencies.load_paths
0.00 5.20 0.00 4 0.00 17.50 Module#local_constants
0.00 5.20 0.00 2 0.00 0.00 Array#delete_if
0.00 5.20 0.00 3 0.00 0.00 File#file?
0.00 5.20 0.00 4 0.00 0.00 Array#map!
0.00 5.20 0.00 4 0.00 0.00 Regexp#===
0.00 5.20 0.00 5 0.00 0.00 Hash#default
0.00 5.20 0.00 9 0.00 0.00 Object#method_added
0.00 5.20 0.00 1 0.00 0.00 ActiveRecord::Validations::ClassMethods.validates_uniqueness_of
0.00 5.20 0.00 1 0.00 0.00 Exception#initialize
0.00 5.20 0.00 5 0.00 0.00 Array#flatten
0.00 5.20 0.00 18 0.00 0.00 Kernel.is_a?
0.00 5.20 0.00 4 0.00 0.00 Kernel.block_given?
0.00 5.20 0.00 1 0.00 0.00 Array#uniq!
0.00 5.20 0.00 1 0.00 0.00 ActiveSupport::Inflector.underscore
0.00 5.20 0.00 1 0.00 0.00 Enumerable.any?
0.00 5.20 0.00 2 0.00 0.00 Array#initialize_copy
0.00 5.20 0.00 2 0.00 0.00 String#+
0.00 5.20 0.00 2 0.00 0.00 Hash#symbolize_keys
0.00 5.20 0.00 1 0.00 0.00 TrueClass#duplicable?
0.00 5.20 0.00 34 0.00 0.00 Module#==
0.00 5.20 0.00 12 0.00 0.00 String#empty?
0.00 5.20 0.00 2 0.00 0.00 Hash#initialize_copy
0.00 5.20 0.00 1 0.00 0.00 String#downcase
0.00 5.20 0.00 4 0.00 0.00 Array#flatten!
0.00 5.20 0.00 10 0.00 13.00 Array#collect
0.00 5.20 0.00 3 0.00 0.00 String#upcase
0.00 5.20 0.00 1 0.00 0.00 ActiveSupport::Dependencies.search_for_file
0.00 5.20 0.00 2 0.00 80.00 ActiveSupport::Dependencies.new_constants_in
0.00 5.20 0.00 2 0.00 0.00 Symbol#to_sym
0.00 5.20 0.00 8 0.00 0.00 Regexp#escape
0.00 5.20 0.00 3 0.00 0.00 Array#*
0.00 5.20 0.00 4 0.00 0.00 String#blank?
0.00 5.20 0.00 11 0.00 0.00 Enumerable.inject
0.00 5.20 0.00 3 0.00 0.00 Hash#each
0.00 5.20 0.00 24 0.00 0.00 Module#constants
0.00 5.20 0.00 9 0.00 0.00 ActiveSupport::Dependencies.log_activity
0.00 5.20 0.00 4 0.00 0.00 Array#<<
0.00 5.20 0.00 2 0.00 0.00 ActiveSupport::Inflector.camelize
0.00 5.20 0.00 1 0.00 140.00 ActiveSupport::Dependencies.require_or_load
0.00 5.20 0.00 10 0.00 0.00 ActiveSupport::Dependencies.uninherited_const_defined?
0.00 5.20 0.00 4 0.00 0.00 ActiveSupport::Inflector.constantize
0.00 5.20 0.00 1 0.00 0.00 ActiveRecord::DynamicScopeMatch#initialize
0.00 5.20 0.00 1 0.00 0.00 ActiveRecord::Base#respond_to?
0.00 5.20 0.00 1 0.00 0.00 ActiveSupport::Dependencies.qualified_name_for
0.00 5.20 0.00 1 0.00 140.00 ActiveSupport::Dependencies.load_missing_constant
0.00 5.20 0.00 5 0.00 0.00 ActiveSupport::Dependencies.log_call
0.00 5.20 0.00 1 0.00 5060.00 User#encrypted_password
0.00 5.20 0.00 1 0.00 0.00 Digest::Base#update
0.00 5.20 0.00 1 0.00 0.00 ActiveRecord::DynamicScopeMatch#match
0.00 5.20 0.00 5 0.00 0.00 Symbol#===
0.00 5.20 0.00 1 0.00 0.00 String#underscore
0.00 5.20 0.00 1 0.00 0.00 String#tr
0.00 5.20 0.00 2 0.00 0.00 Set#<<
0.00 5.20 0.00 5 0.00 0.00 Symbol#to_s
0.00 5.20 0.00 2 0.00 0.00 Kernel.hash
0.00 5.20 0.00 3 0.00 0.00 ActiveRecord::Validations::ClassMethods.validation_method
0.00 5.20 0.00 1 0.00 10.00 ActiveSupport::Dependencies.loadable_constants_for_path
0.00 5.20 0.00 2 0.00 0.00 String#camelize
0.00 5.20 0.00 1 0.00 0.00 ActiveRecord::Validations::ClassMethods.validates_confirmation_of
0.00 5.20 0.00 4 0.00 0.00 ActiveSupport::Callbacks::CallbackChain#build
0.00 5.20 0.00 10 0.00 0.00 Fixnum#==
0.00 5.20 0.00 2 0.00 0.00 Hash#include?
0.00 5.20 0.00 18 0.00 0.00 Kernel.object_id
0.00 5.20 0.00 4 0.00 0.00 ActiveSupport::Callbacks::CallbackChain#extract_options
0.00 5.20 0.00 2 0.00 0.00 Digest::Base#reset
0.00 5.20 0.00 4 0.00 0.00 ActiveRecord::Base#validate
0.00 5.20 0.00 1 0.00 0.00 Array#uniq
0.00 5.20 0.00 1 0.00 0.00 ActiveSupport::Dependencies.load_once_path?
0.00 5.20 0.00 2 0.00 0.00 ActiveRecord::Validations::ClassMethods.validates_each
0.00 5.20 0.00 2 0.00 0.00 ActiveSupport::Dependencies.mechanism
0.00 5.20 0.00 1 0.00 0.00 ActiveRecord::Observing::ClassMethods.inherited
0.00 5.20 0.00 2 0.00 0.00 Kernel.equal?
0.00 5.20 0.00 6 0.00 0.00 Mutex#synchronize
0.00 5.20 0.00 1 0.00 30.00 ActiveSupport::Dependencies::Loadable.require
0.00 5.20 0.00 6 0.00 0.00 ActiveSupport::Dependencies.constant_watch_stack
0.00 5.20 0.00 4 0.00 0.00 Object#duplicable?
0.00 5.20 0.00 4 0.00 30.00 Module#local_constant_names
0.00 5.20 0.00 7 0.00 0.00 String#==
0.00 5.20 0.00 7 0.00 0.00 Array#include?
0.00 5.20 0.00 21 0.00 0.00 Module#const_get
0.00 5.20 0.00 749 0.00 0.00 Hash#key?
0.00 5.20 0.00 1 0.00 0.00 NameError#initialize
0.00 5.20 0.00 9 0.00 0.00 Array#extract_options!
0.00 5.20 0.00 1 0.00 0.00 Module#private
0.00 5.20 0.00 6 0.00 0.00 String#[]
0.00 5.20 0.00 12 0.00 0.00 Class#new
0.00 5.20 0.00 1 0.00 0.00 ActiveSupport::Dependencies.to_constant_name
0.00 5.20 0.00 13 0.00 0.00 Hash#[]
0.00 5.20 0.00 12 0.00 0.00 String#split
0.00 5.20 0.00 2 0.00 0.00 Kernel.singleton_method_added
0.00 5.20 0.00 3 0.00 0.00 ActiveSupport::Dependencies.loaded
0.00 5.20 0.00 2 0.00 0.00 Set#include?
0.00 5.20 0.00 2 0.00 0.00 Module#attr_accessor
0.00 5.20 0.00 7 0.00 0.00 String#gsub
0.00 5.20 0.00 2 0.00 0.00 Class#inherited
0.00 5.20 0.00 6 0.00 0.00 Module#name
0.00 5.20 0.00 1 0.00 0.00 ActiveSupport::Dependencies.warnings_on_first_load
0.00 5.20 0.00 4 0.00 0.00 ActiveSupport::Dependencies.log
0.00 5.20 0.00 4 0.00 0.00 Kernel.dup
0.00 5.20 0.00 1 0.00 0.00 Digest::Class#digest
0.00 5.20 0.00 6 0.00 0.00 ActiveSupport::Dependencies.constant_watch_stack_mutex
0.00 5.20 0.00 40 0.00 0.00 Array#each
0.00 5.20 0.00 5 0.00 0.00 Array#initialize
0.00 5.20 0.00 1 0.00 0.00 ActiveRecord::DynamicFinderMatch#match
0.00 5.20 0.00 1 0.00 0.00 Array#compact
0.00 5.20 0.00 1 0.00 0.00 Observable.notify_observers
0.00 5.20 0.00 1 0.00 0.00 ActiveRecord::Validations::ClassMethods.validates_presence_of
0.00 5.20 0.00 3 0.00 0.00 Kernel.send
0.00 5.20 0.00 9 0.00 0.00 Array#last
0.00 5.20 0.00 2 0.00 0.00 String#size
0.00 5.20 0.00 1 0.00 0.00 ActiveRecord::Base#inherited
0.00 5.20 0.00 1 0.00 0.00 Object#initialize
0.00 5.20 0.00 1 0.00 0.00 Kernel.gem_original_require
0.00 5.20 0.00 14 0.00 0.00 Module#const_defined?
0.00 5.20 0.00 1 0.00 0.00 Digest::Base#finish
0.00 5.20 0.00 1 0.00 0.00 ActiveSupport::Dependencies.history
0.00 5.20 0.00 2 0.00 0.00 Kernel.respond_to?
0.00 5.20 0.00 2 0.00 0.00 Array#-
0.00 5.20 0.00 9 0.00 0.00 ActiveSupport::Dependencies.logger
0.00 5.20 0.00 12 0.00 0.00 Array#first
0.00 5.20 0.00 1 0.00 0.00 ActiveSupport::Dependencies.load_once_paths
0.00 5.20 0.00 4 0.00 0.00 ActiveSupport::Callbacks::Callback#initialize
0.00 5.20 0.00 4 0.00 0.00 Module#ancestors
0.00 5.20 0.00 11 0.00 0.00 File#expand_path
0.00 5.20 0.00 5 0.00 0.00 Array#empty?
0.00 5.20 0.00 10 0.00 0.00 Array#concat
0.00 5.20 0.00 1 0.00 140.00 ActiveSupport::Dependencies::ClassConstMissing.const_missing
0.00 5.20 0.00 1 0.00 130.00 ActiveSupport::Dependencies.load_file
0.00 5.20 0.00 9 0.00 0.00 Module#blank_slate_method_added
0.00 5.20 0.00 12 0.00 0.00 Hash#[]=
0.00 5.20 0.00 3 0.00 0.00 File#join
0.00 5.20 0.00 1 0.00 0.00 Observable.changed
0.00 5.20 0.00 3 0.00 0.00 Class#inheritable_attributes
0.00 5.20 0.00 8 0.00 0.00 Hash#update
0.00 5.20 0.00 1 0.00 5200.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/generate
script/destroy
script/runner
script/plugin
script/console
script/performance/benchmarker
script/performance/profiler
script/dbconsole
script/server
script/about
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-test
/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
/home/rubys/svn/rexml/src
/home/rubys/svn/html5lib/ruby/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/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/20090528172552_create_people.rb
rake db:migrate
mv 20090528172552_create_people.rb 20080601000001_create_people.rb
(in /home/rubys/git/awdwr/work/namelist)
== CreatePeople: migrating ===================================================
-- create_table(:people)
-> 0.0015s
== CreatePeople: migrated (0.0017s) ==========================================
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/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/Rakefile' -> `vendor/plugins/acts_as_tree/Rakefile'
`/home/rubys/git/awdwr/plugins/acts_as_tree/test' -> `vendor/plugins/acts_as_tree/test'
`/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/test/database.yml' -> `vendor/plugins/acts_as_tree/test/database.yml'
`/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/abstract_unit.rb' -> `vendor/plugins/acts_as_tree/test/abstract_unit.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/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/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/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/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/init.rb' -> `vendor/plugins/country_select/init.rb'
`/home/rubys/git/awdwr/plugins/country_select/install.rb' -> `vendor/plugins/country_select/install.rb'
`/home/rubys/git/awdwr/plugins/country_select/MIT-LICENSE' -> `vendor/plugins/country_select/MIT-LICENSE'
`/home/rubys/git/awdwr/plugins/country_select/uninstall.rb' -> `vendor/plugins/country_select/uninstall.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/20080601000002_add_price_to_product.rb' -> `db/migrate/20080601000002_add_price_to_product.rb'
`../depot/db/migrate/20080601000007_create_users.rb' -> `db/migrate/20080601000007_create_users.rb'
`../depot/db/migrate/20080601000006_create_line_items.rb' -> `db/migrate/20080601000006_create_line_items.rb'
`../depot/db/migrate/20080601000003_add_test_data.rb' -> `db/migrate/20080601000003_add_test_data.rb'
`../depot/db/migrate/20080601000004_create_sessions.rb' -> `db/migrate/20080601000004_create_sessions.rb'
`../depot/db/migrate/20080601000001_create_products.rb' -> `db/migrate/20080601000001_create_products.rb'
`../depot/db/migrate/20080601000005_create_orders.rb' -> `db/migrate/20080601000005_create_orders.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/20090528172557_create_discounts.rb
ruby script/generate migration add_status_to_user status:string
exists db/migrate
create db/migrate/20090528172558_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 20090528172557_create_discounts.rb 20080601000009_create_discounts.rb
mv 20090528172558_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.0012s
== AddEmailToOrders: migrated (0.0013s) ======================================
== CreateDiscounts: migrating ================================================
-- create_table(:discounts)
-> 0.0015s
== CreateDiscounts: migrated (0.0016s) =======================================
== AddStatusToUser: migrating ================================================
-- add_column(:users, :status, :string)
-> 0.0009s
== AddStatusToUser: migrated (0.0011s) =======================================
rake annotate_models
(in /home/rubys/git/awdwr/work/migration)
Skipping Cart
Skipping CartItem
Annotating User
Annotating Discount
Annotating Product
Annotating LineItem
Annotating Order
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=>Thu May 28 13:26:02 -0400 2009})
-> 0.0013s
== AddPlacedAtToOrders: migrated (0.0015s) ===================================
rake annotate_models
(in /home/rubys/git/awdwr/work/migration)
Skipping Cart
Skipping CartItem
Annotating User
Annotating Discount
Annotating Product
Annotating LineItem
Annotating Order
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.0007s
-- add_column(:orders, :ship_class, :string, {:default=>"priority", :null=>false})
-> 0.0008s
-- add_column(:orders, :amount, :decimal, {:precision=>8, :scale=>2})
-> 0.0007s
-- add_column(:orders, :state, :string, {:limit=>2})
-> 0.0007s
== AddColumnsToOrders: migrated (0.0046s) ====================================
rake annotate_models
(in /home/rubys/git/awdwr/work/migration)
Skipping Cart
Skipping CartItem
Annotating User
Annotating Discount
Annotating Product
Annotating LineItem
Annotating Order
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.0345s
== RenameEmailColumn: migrated (0.0347s) =====================================
rake annotate_models
(in /home/rubys/git/awdwr/work/migration)
Skipping Cart
Skipping CartItem
Annotating User
Annotating Discount
Annotating Product
Annotating LineItem
Annotating Order
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.0334s
== ChangeOrderTypeToString: migrated (0.0335s) ===============================
rake annotate_models
(in /home/rubys/git/awdwr/work/migration)
Skipping Cart
Skipping CartItem
Annotating User
Annotating Discount
Annotating Product
Annotating LineItem
Annotating Order
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.0023s
== CreateOrderHistories: migrated (0.0024s) ==================================
rake annotate_models
(in /home/rubys/git/awdwr/work/migration)
Skipping Cart
Skipping CartItem
Annotating User
Annotating Discount
Annotating Product
Annotating LineItem
Annotating Order
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)
Skipping Cart
Skipping CartItem
Annotating User
Annotating Discount
Annotating Product
Annotating LineItem
Annotating Order
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.0011s
== RenameOrderHistories: migrated (0.0012s) ==================================
rake annotate_models
(in /home/rubys/git/awdwr/work/migration)
Skipping Cart
Skipping CartItem
Annotating User
Annotating Discount
Annotating Product
Annotating LineItem
Annotating Order
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.0020s
== CreateOrderHistories2: migrated (0.0138s) =================================
rake annotate_models
(in /home/rubys/git/awdwr/work/migration)
Skipping Cart
Skipping CartItem
Annotating User
Annotating Discount
Annotating Product
Annotating LineItem
Annotating Order
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.0009s
== AddCustomerNameIndexToOrders: migrated (0.0011s) ==========================
rake annotate_models
(in /home/rubys/git/awdwr/work/migration)
Skipping Cart
Skipping CartItem
Annotating User
Annotating Discount
Annotating Product
Annotating LineItem
Annotating Order
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.0015s
== CreateAuthorBook: migrated (0.0016s) ======================================
rake annotate_models
(in /home/rubys/git/awdwr/work/migration)
Skipping Cart
Skipping CartItem
Annotating User
Annotating Discount
Annotating Product
Annotating LineItem
Annotating Order
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.0018s
== CreateTableTickets: migrated (0.0019s) ====================================
rake annotate_models
(in /home/rubys/git/awdwr/work/migration)
Skipping Cart
Skipping CartItem
Annotating User
Annotating Discount
Annotating Product
Annotating LineItem
Annotating Order
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.0038s) =========================================
rm db/migrate/20080601000021_test_discounts.rb
rake annotate_models
(in /home/rubys/git/awdwr/work/migration)
Skipping Cart
Skipping CartItem
Annotating User
Annotating Discount
Annotating Product
Annotating LineItem
Annotating Order
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)
Skipping Cart
Skipping CartItem
Annotating User
Annotating Discount
Annotating Product
Annotating LineItem
Annotating Order
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.0076s) ==========================================
== LoadUserData: migrated (0.0133s) ==========================================
rake annotate_models
(in /home/rubys/git/awdwr/work/migration)
Skipping Cart
Skipping CartItem
Annotating User
Annotating Discount
Annotating Product
Annotating LineItem
Annotating Order
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.0188s
== ChangePriceToInteger: migrated (0.0278s) ==================================
rake annotate_models
(in /home/rubys/git/awdwr/work/migration)
Skipping Cart
Skipping CartItem
Annotating User
Annotating Discount
Annotating Product
Annotating LineItem
Annotating Order
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.0011s
== TotalPriceToUnit: migrated (0.0101s) ======================================
rake annotate_models
(in /home/rubys/git/awdwr/work/migration)
Skipping Cart
Skipping CartItem
Annotating User
Annotating Discount
Annotating Product
Annotating LineItem
Annotating Order
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.0010s
-- 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.0004s
-- 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.0006s
-- 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.0004s
== AddForeignKey: migrated (0.0079s) =========================================
rake annotate_models
(in /home/rubys/git/awdwr/work/migration)
Skipping Cart
Skipping CartItem
Annotating User
Annotating Discount
Annotating Product
Annotating LineItem
Annotating Order
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
<" name = Dave Thomas"> expected but was
<" name = Joe User">.
Traceback:
./checkdepot.rb:295
./checkdepot.rb:18:in `instance_eval'
./checkdepot.rb:18:in `test_18_Active_Record:_The_Basics'
/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'
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:0xb73e3b4c @null=true, @scale=nil, @sql_type="varchar(10)", @default=nil, @type=:string, @precision=nil, @primary=false, @name="pay_type", @limit=10>
>>
sqlite3> select * from orders limit 1
id = 1
name = Joe User
address = 123 Main St., Anytown USA
email = juser@hotmail.com
pay_type = check
created_at = 2009-05-28 17:25:16.365973
updated_at = 2009-05-28 17:25:16.365973
customer_email =
placed_at = 2009-05-28 13:26:02.923817
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-28 17:24:34.797794"
>>
irb e1/ar/new_examples.rb
>> $: << File.dirname(__FILE__)
=> ["/home/rubys/svn/rexml/src", "/home/rubys/svn/html5lib/ruby/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/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-28 13:26:02", attn: nil, order_type: nil, ship_class: "priority", amount: nil, state: nil>
>> an_order.name = "Dave Thomas"
=> "Dave Thomas"
>> an_order.email = "dave@example.com"
=> "dave@example.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: 3, name: "Dave Thomas", address: nil, email: nil, pay_type: nil, created_at: "2009-05-28 13:26:56", updated_at: "2009-05-28 13:26:56", customer_email: nil, placed_at: "2009-05-28 13:26:02", attn: nil, order_type: nil, ship_class: "priority", amount: nil, state: nil>
?> an_order = Order.new(
?> :name => "Dave Thomas",
?> :email => "dave@example.com",
?> :address => "123 Main St",
?> :pay_type => "check")
=> #<Order id: nil, name: "Dave Thomas", address: "123 Main St", email: "dave@example.com", pay_type: "check", created_at: nil, updated_at: nil, customer_email: nil, placed_at: "2009-05-28 13:26:02", 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-28 13:26:02", 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 5
=> nil
?> an_order = Order.create(
?> :name => "Dave Thomas",
?> :email => "dave@example.com",
?> :address => "123 Main St",
?> :pay_type => "check")
=> #<Order id: 6, name: "Dave Thomas", address: "123 Main St", email: "dave@example.com", pay_type: "check", created_at: "2009-05-28 13:26:56", updated_at: "2009-05-28 13:26:56", customer_email: nil, placed_at: "2009-05-28 13:26:02", attn: nil, order_type: nil, ship_class: "priority", amount: nil, state: nil>
?> orders = Order.create(
?> [ { :name => "Dave Thomas",
?> :email => "dave@example.com",
?> :address => "123 Main St",
?> :pay_type => "check"
>> },
?> { :name => "Andy Hunt",
?> :email => "andy@example.com",
?> :address => "456 Gentle Drive",
?> :pay_type => "po"
>> } ] )
=> [#<Order id: 7, name: "Dave Thomas", address: "123 Main St", email: "dave@example.com", pay_type: "check", created_at: "2009-05-28 13:26:56", updated_at: "2009-05-28 13:26:56", customer_email: nil, placed_at: "2009-05-28 13:26:02", attn: nil, order_type: nil, ship_class: "priority", amount: nil, state: nil>, #<Order id: 8, name: "Andy Hunt", address: "456 Gentle Drive", email: "andy@example.com", pay_type: "po", created_at: "2009-05-28 13:26:56", updated_at: "2009-05-28 13:26:56", customer_email: nil, placed_at: "2009-05-28 13:26:02", attn: nil, order_type: nil, ship_class: "priority", amount: nil, state: nil>]
>> >> => nil
irb e1/ar/find_examples.rb
>> $: << File.dirname(__FILE__)
=> ["/home/rubys/svn/rexml/src", "/home/rubys/svn/html5lib/ruby/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/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:0xb7748508 @progname=nil, @formatter=nil, @default_formatter=#<Logger::Formatter:0xb77484e0 @datetime_format=nil>, @logdev=#<Logger::LogDevice:0xb77484b8 @mutex=#<Logger::LogDevice::LogDeviceMutex:0xb7748490 @mon_count=0, @mon_owner=nil, @mon_waiting_queue=[], @mon_entering_queue=[]>, @filename=nil, @shift_size=nil, @shift_age=nil, @dev=#<IO:0xb7c8ef6c>>, @level=0>
?> 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:0xb782edf0@/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:0xb782edf0@/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.5ms) SELECT * FROM "orders" LIMIT 1
=> #<Order id: 1, name: "Joe User", address: "123 Main St., Anytown USA", email: "juser@hotmail.com", pay_type: "check", created_at: "2009-05-28 17:25:16", updated_at: "2009-05-28 17:25:16", customer_email: nil, placed_at: "2009-05-28 13:26:02", 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.7ms) SELECT * FROM "orders" WHERE (name = 'Dave Thomas') LIMIT 1
=> #<Order id: 2, name: "Dave Thomas", address: "123 Main St", email: "dave@example.com", pay_type: "check", created_at: "2009-05-28 13:26:56", updated_at: "2009-05-28 13:26:56", customer_email: nil, placed_at: "2009-05-28 13:26:02", 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.6ms) SELECT * FROM "orders" WHERE (name = 'Dave Thomas') ORDER BY id DESC LIMIT 1
=> #<Order id: 7, name: "Dave Thomas", address: "123 Main St", email: "dave@example.com", pay_type: "check", created_at: "2009-05-28 13:26:56", updated_at: "2009-05-28 13:26:56", customer_email: nil, placed_at: "2009-05-28 13:26:02", 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'
=> []
?> orders = Order.find_by_sql("select name, pay_type from orders")
Order Load (0.6ms) select name, pay_type from orders
=> [#<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: "Joe User", pay_type: "check">
>> p first.attributes
{"name"=>"Joe User", "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: "Joe User", address: "123 Main St., Anytown USA", email: "juser@hotmail.com", pay_type: "check", created_at: "2009-05-28 17:25:16", updated_at: "2009-05-28 17:25:16", customer_email: nil, placed_at: "2009-05-28 13:26:02", attn: nil, order_type: nil, ship_class: "priority", amount: nil, state: nil>, #<Order id: 2, name: "Dave Thomas", address: "123 Main St", email: "dave@example.com", pay_type: "check", created_at: "2009-05-28 13:26:56", updated_at: "2009-05-28 13:26:56", customer_email: nil, placed_at: "2009-05-28 13:26:02", attn: nil, order_type: nil, ship_class: "priority", amount: nil, state: nil>, #<Order id: 3, name: "Dave Thomas", address: nil, email: nil, pay_type: nil, created_at: "2009-05-28 13:26:56", updated_at: "2009-05-28 13:26:56", customer_email: nil, placed_at: "2009-05-28 13:26:02", attn: nil, order_type: nil, ship_class: "priority", amount: nil, state: nil>, #<Order id: 4, name: "Dave Thomas", address: "123 Main St", email: "dave@example.com", pay_type: "check", created_at: "2009-05-28 13:26:56", updated_at: "2009-05-28 13:26:56", customer_email: nil, placed_at: "2009-05-28 13:26:02", attn: nil, order_type: nil, ship_class: "priority", amount: nil, state: nil>, #<Order id: 5, name: "Dave Thomas", address: nil, email: nil, pay_type: nil, created_at: "2009-05-28 13:26:56", updated_at: "2009-05-28 13:26:56", customer_email: nil, placed_at: "2009-05-28 13:26:02", attn: nil, order_type: nil, ship_class: "priority", amount: nil, state: nil>, #<Order id: 6, name: "Dave Thomas", address: "123 Main St", email: "dave@example.com", pay_type: "check", created_at: "2009-05-28 13:26:56", updated_at: "2009-05-28 13:26:56", customer_email: nil, placed_at: "2009-05-28 13:26:02", attn: nil, order_type: nil, ship_class: "priority", amount: nil, state: nil>, #<Order id: 7, name: "Dave Thomas", address: "123 Main St", email: "dave@example.com", pay_type: "check", created_at: "2009-05-28 13:26:56", updated_at: "2009-05-28 13:26:56", customer_email: nil, placed_at: "2009-05-28 13:26:02", attn: nil, order_type: nil, ship_class: "priority", amount: nil, state: nil>, #<Order id: 8, name: "Andy Hunt", address: "456 Gentle Drive", email: "andy@example.com", pay_type: "po", created_at: "2009-05-28 13:26:56", updated_at: "2009-05-28 13:26:56", customer_email: nil, placed_at: "2009-05-28 13:26:02", attn: nil, order_type: nil, ship_class: "priority", amount: nil, state: nil>]
=> nil
>> p Order.check(:order => "created_on desc").first
Order Load (1.2ms) SELECT * FROM "orders" WHERE ("orders"."pay_type" = 'check') LIMIT 1
#<Order id: 1, name: "Joe User", address: "123 Main St., Anytown USA", email: "juser@hotmail.com", pay_type: "check", created_at: "2009-05-28 17:25:16", updated_at: "2009-05-28 17:25:16", customer_email: nil, placed_at: "2009-05-28 13:26:02", attn: nil, order_type: nil, ship_class: "priority", amount: nil, state: nil>
=> nil
>> p Order.po.recent.count
SQL (0.4ms) SELECT count(*) AS count_all FROM "orders" WHERE ((created_at > '2009-05-21 13:26:57') AND ("orders"."pay_type" = 'po'))
1
=> nil
>> p Order.check.find_by_name('Dave Thomas')
Order Load (0.6ms) SELECT * FROM "orders" WHERE ("orders"."name" = 'Dave Thomas') AND ("orders"."pay_type" = 'check') LIMIT 1
#<Order id: 2, name: "Dave Thomas", address: "123 Main St", email: "dave@example.com", pay_type: "check", created_at: "2009-05-28 13:26:56", updated_at: "2009-05-28 13:26:56", customer_email: nil, placed_at: "2009-05-28 13:26:02", attn: nil, order_type: nil, ship_class: "priority", amount: nil, state: nil>
=> nil
?> p Order.po.recent(:order => :created_at)
Order Load (0.6ms) SELECT * FROM "orders" WHERE ((created_at > '2009-05-21 13:26:57') AND ("orders"."pay_type" = 'po'))
[#<Order id: 8, name: "Andy Hunt", address: "456 Gentle Drive", email: "andy@example.com", pay_type: "po", created_at: "2009-05-28 13:26:56", updated_at: "2009-05-28 13:26:56", customer_email: nil, placed_at: "2009-05-28 13:26:02", attn: nil, order_type: nil, ship_class: "priority", amount: nil, state: nil>]
=> nil
>> p Order.po.since(1.week.ago)
Order Load (0.6ms) SELECT * FROM "orders" WHERE ((created_at > '2009-05-21 13:26:57') AND ("orders"."pay_type" = 'po'))
[#<Order id: 8, name: "Andy Hunt", address: "456 Gentle Drive", email: "andy@example.com", pay_type: "po", created_at: "2009-05-28 13:26:56", updated_at: "2009-05-28 13:26:56", customer_email: nil, placed_at: "2009-05-28 13:26:02", attn: nil, order_type: nil, ship_class: "priority", amount: nil, state: nil>]
=> nil
>> LineItem.delete_all
LineItem Delete all (0.5ms) DELETE FROM "line_items" WHERE 1=1
=> 0
>> Product.delete_all
Product Delete all (6.5ms) DELETE FROM "products" WHERE 1=1
=> 3
>> p = Product.create(:title => "Programming Ruby", :price => 49.95)
Product Create (0.4ms) INSERT INTO "products" ("image_url", "updated_at", "title", "price", "description", "created_at") VALUES(NULL, '2009-05-28 13:26:57', 'Programming Ruby', 49.95, NULL, '2009-05-28 13:26:57')
=> #<Product id: 5, title: "Programming Ruby", description: nil, image_url: nil, created_at: "2009-05-28 13:26:57", updated_at: "2009-05-28 13:26:57", price: #<BigDecimal:b77950b0,'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.5ms) INSERT INTO "line_items" ("order_id", "updated_at", "total_price", "product_id", "quantity", "unit_price", "created_at") VALUES(1, '2009-05-28 13:26:57', 99, 5, 2, 49.95, '2009-05-28 13:26:57')
=> #<LineItem id: 1, product_id: 5, order_id: 1, quantity: 2, total_price: 99, created_at: "2009-05-28 13:26:57", updated_at: "2009-05-28 13:26:57", unit_price: #<BigDecimal:b7772880,'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.7ms) 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-28 13:26:57", updated_at: "2009-05-28 13:26:57", unit_price: #<BigDecimal:b77510cc,'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-28 13:26:57", updated_at: "2009-05-28 13:26:57", unit_price: #<BigDecimal:b774e5d4,'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.3ms) SELECT count(*) AS count_all FROM "orders"
=> 8
>> c2 = Order.count(:conditions => ["name = ?", "Dave Thomas"])
SQL (0.4ms) SELECT count(*) AS count_all FROM "orders" WHERE (name = 'Dave Thomas')
=> 6
>> 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.4ms) select count(*) from line_items, orders where line_items.order_id = orders.id and orders.name = 'Dave Thomas'
=> 0
>> puts "Dave has #{c3} line items in #{c2} orders (#{c1} orders in all)"
Dave has 0 line items in 6 orders (8 orders in all)
=> nil
?> order = Order.find_by_name("Dave Thomas")
Order Load (0.6ms) SELECT * FROM "orders" WHERE ("orders"."name" = 'Dave Thomas') LIMIT 1
=> #<Order id: 2, name: "Dave Thomas", address: "123 Main St", email: "dave@example.com", pay_type: "check", created_at: "2009-05-28 13:26:56", updated_at: "2009-05-28 13:26:56", customer_email: nil, placed_at: "2009-05-28 13:26:02", attn: nil, order_type: nil, ship_class: "priority", amount: nil, state: nil>
>> orders = Order.find_all_by_name("Dave Thomas")
Order Load (1.4ms) SELECT * FROM "orders" WHERE ("orders"."name" = 'Dave Thomas')
=> [#<Order id: 2, name: "Dave Thomas", address: "123 Main St", email: "dave@example.com", pay_type: "check", created_at: "2009-05-28 13:26:56", updated_at: "2009-05-28 13:26:56", customer_email: nil, placed_at: "2009-05-28 13:26:02", attn: nil, order_type: nil, ship_class: "priority", amount: nil, state: nil>, #<Order id: 3, name: "Dave Thomas", address: nil, email: nil, pay_type: nil, created_at: "2009-05-28 13:26:56", updated_at: "2009-05-28 13:26:56", customer_email: nil, placed_at: "2009-05-28 13:26:02", attn: nil, order_type: nil, ship_class: "priority", amount: nil, state: nil>, #<Order id: 4, name: "Dave Thomas", address: "123 Main St", email: "dave@example.com", pay_type: "check", created_at: "2009-05-28 13:26:56", updated_at: "2009-05-28 13:26:56", customer_email: nil, placed_at: "2009-05-28 13:26:02", attn: nil, order_type: nil, ship_class: "priority", amount: nil, state: nil>, #<Order id: 5, name: "Dave Thomas", address: nil, email: nil, pay_type: nil, created_at: "2009-05-28 13:26:56", updated_at: "2009-05-28 13:26:56", customer_email: nil, placed_at: "2009-05-28 13:26:02", attn: nil, order_type: nil, ship_class: "priority", amount: nil, state: nil>, #<Order id: 6, name: "Dave Thomas", address: "123 Main St", email: "dave@example.com", pay_type: "check", created_at: "2009-05-28 13:26:56", updated_at: "2009-05-28 13:26:56", customer_email: nil, placed_at: "2009-05-28 13:26:02", attn: nil, order_type: nil, ship_class: "priority", amount: nil, state: nil>, #<Order id: 7, name: "Dave Thomas", address: "123 Main St", email: "dave@example.com", pay_type: "check", created_at: "2009-05-28 13:26:56", updated_at: "2009-05-28 13:26:56", customer_email: nil, placed_at: "2009-05-28 13:26:02", attn: nil, order_type: nil, ship_class: "priority", amount: nil, state: nil>]
>> orders = Order.find_all_by_email(params['email'])
Order Load (0.7ms) SELECT * FROM "orders" WHERE ("orders"."email" IS NULL)
=> [#<Order id: 3, name: "Dave Thomas", address: nil, email: nil, pay_type: nil, created_at: "2009-05-28 13:26:56", updated_at: "2009-05-28 13:26:56", customer_email: nil, placed_at: "2009-05-28 13:26:02", attn: nil, order_type: nil, ship_class: "priority", amount: nil, state: nil>, #<Order id: 5, name: "Dave Thomas", address: nil, email: nil, pay_type: nil, created_at: "2009-05-28 13:26:56", updated_at: "2009-05-28 13:26:56", customer_email: nil, placed_at: "2009-05-28 13:26:02", 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: 1, product_id: 5, order_id: 1, quantity: 2, total_price: 99, created_at: "2009-05-28 13:26:57", updated_at: "2009-05-28 13:26:57", unit_price: #<BigDecimal:b7a41a70,'0.4995E2',8(8)>>]
>> p o.size
1
=> nil
>> LineItem.delete_all
LineItem Delete all (2.3ms) DELETE FROM "line_items" WHERE 1=1
=> 1
>> res = Order.update_all("pay_type = 'wibble'")
Order Update (1.8ms) UPDATE "orders" SET pay_type = 'wibble'
=> 8
>> p res
8
=> nil
>> res = Order.delete_all(["pay_type = ?", "wibble"])
Order Delete all (2.7ms) DELETE FROM "orders" WHERE (pay_type = 'wibble')
=> 8
>> p res
8
=> nil
irb e1/ar/dump_serialize_table.rb
>> $: << File.dirname(__FILE__)
=> ["/home/rubys/svn/rexml/src", "/home/rubys/svn/html5lib/ruby/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/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.0708s
=> 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__)
=> ["/home/rubys/svn/rexml/src", "/home/rubys/svn/html5lib/ruby/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/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.0802s
=> 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:0xb7871d80 @active_record=Purchase(id: integer, name: string, last_five: text), @name=:last_five, @macro=:composed_of, @options={}>
>> 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:0xb77f819c @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, @options={:class_name=>"Name", :mapping=>[["first_name", "first"], ["initials", "initials"], ["last_name", "last"]]}>
>> Customer.delete_all
=> 0
?> name = Name.new("Dwight", "D", "Eisenhower")
=> #<Name:0xb77e1f78 @initials="D", @first="Dwight", @last="Eisenhower">
>> Customer.create(:credit_limit => 1000, :name => name)
=> #<Customer id: 1, created_at: "2009-05-28 13:26:58", credit_limit: #<BigDecimal:b77d3b6c,'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-28 13:26:58", credit_limit: #<BigDecimal:b77cf864,'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:0xb77c3ba4 @initials=nil, @first="Harry", @last="Truman">
>> customer.save
=> true
>> >> => nil
19 ActiveRecord: Relationships Between Tables
irb e1/ar/associations.rb
>> $: << File.dirname(__FILE__)
=> ["/home/rubys/svn/rexml/src", "/home/rubys/svn/html5lib/ruby/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/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.0726s
-- create_table(:line_items, {:force=>true})
-> 0.0074s
=> nil
?> class Product < ActiveRecord::Base
>> has_many :line_items
>> end
=> #<Proc:0xb77f3660@/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:0xb77f3174@/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-28 13:26:58">
>> 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-28 13:26:58">
>> 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-28 13:26:58">
>> 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:b77ce824,'0.3495E2',8(8)>, available_at: "2009-05-28 13:26:59">
>> 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:b779a448,'0.3295E2',8(8)>, available_at: "2009-05-28 13:26:59">
>> 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:b7761bfc,'0.3495E2',8(8)>, available_at: "2009-05-28 13:26:59">
>> 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:b7752b84,'0.3495E2',8(8)>, available_at: "2009-05-28 13:26:59">
=> nil
>> puts "============="
=============
=> nil
>> prod = Product.find(item.product_id)
=> #<Product id: 4, title: "Advanced Rails", description: "...", image_url: "http://....jpg", price: #<BigDecimal:b774a9ac,'0.3495E2',8(8)>, available_at: "2009-05-28 13:26:59">
>> p prod.line_items.size
1
=> nil
irb e1/ar/sti.rb
>> $: << File.dirname(__FILE__)
=> ["/home/rubys/svn/rexml/src", "/home/rubys/svn/html5lib/ruby/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/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:0xb77a84f8 @progname=nil, @formatter=nil, @default_formatter=#<Logger::Formatter:0xb77a84d0 @datetime_format=nil>, @logdev=#<Logger::LogDevice:0xb77a84a8 @mutex=#<Logger::LogDevice::LogDeviceMutex:0xb77a8480 @mon_count=0, @mon_owner=nil, @mon_waiting_queue=[], @mon_entering_queue=[]>, @filename=nil, @shift_size=nil, @shift_age=nil, @dev=#<IO:0xb7ceef70>>, @level=0>
>> 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.4ms) select sqlite_version(*)
SQL (1.4ms) *[0m SELECT name
FROM sqlite_master
WHERE type = 'table' AND NOT name = 'sqlite_sequence'
*[0m
SQL (5.1ms) 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.0736s
=> 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:0xb786a238@/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.4ms) INSERT INTO "people" ("name", "type", "reports_to", "dept", "email", "balance") VALUES('John Doe', 'Customer', NULL, NULL, 'john@doe.com', 78.29)
=> #<Customer id: 1, type: "Customer", name: "John Doe", email: "john@doe.com", balance: #<BigDecimal:b78f903c,'0.7829E2',8(8)>, reports_to: nil, dept: nil>
>> wilma = Manager.create(:name => 'Wilma Flint', :email => "wilma@here.com",
?> :dept => 23)
Manager Create (0.4ms) INSERT INTO "people" ("name", "type", "reports_to", "dept", "email", "balance") VALUES('Wilma Flint', 'Manager', NULL, 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", "type", "reports_to", "dept", "email", "balance") VALUES('Bert Public', 'Customer', NULL, NULL, 'b@public.net', 12.45)
=> #<Customer id: 3, type: "Customer", name: "Bert Public", email: "b@public.net", balance: #<BigDecimal:b78cb880,'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", "type", "reports_to", "dept", "email", "balance") VALUES('Barney Rub', 'Employee', 2, 23, 'barney@here.com', NULL)
=> true
>> manager = Person.find_by_name("Wilma Flint")
Person Load (0.4ms) 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.5ms) SELECT * FROM "people" WHERE ("people"."name" = 'Bert Public') LIMIT 1
=> #<Customer id: 3, type: "Customer", name: "Bert Public", email: "b@public.net", balance: #<BigDecimal:b783bb04,'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.5ms) 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.5ms) 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__)
=> ["/home/rubys/svn/rexml/src", "/home/rubys/svn/html5lib/ruby/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/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.0708s
-- create_table(:articles, {:force=>true})
-> 0.0040s
-- create_table(:sounds, {:force=>true})
-> 0.0041s
-- create_table(:images, {:force=>true})
-> 0.0039s
=> nil
?> class CatalogEntry < ActiveRecord::Base
>> belongs_to :resource, :polymorphic => true
>> end
=> #<Proc:0xb77e8210@/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:0xb77e8210@/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:0xb77e8210@/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:0xb77e8210@/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-28 13:27:00
resource_id = 1
resource_type = Article
sqlite3> delete from catalog_entries
irb e1/ar/polymorphic.rb 2
>> $: << File.dirname(__FILE__)
=> ["/home/rubys/svn/rexml/src", "/home/rubys/svn/html5lib/ruby/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/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:0xb78a4208@/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:0xb78a4208@/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:0xb78a4208@/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:0xb78a4208@/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-28 13:27:00", resource_id: 2, resource_type: "Article">, #<CatalogEntry id: 3, name: "Image One", acquired_at: "2009-05-28 13:27:00", resource_id: 1, resource_type: "Image">, #<CatalogEntry id: 4, name: "Sound One", acquired_at: "2009-05-28 13:27:00", 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-28 13:27:00
resource_id = 2
resource_type = Article
id = 3
name = Image One
acquired_at = 2009-05-28 13:27:00
resource_id = 1
resource_type = Image
id = 4
name = Sound One
acquired_at = 2009-05-28 13:27:00
resource_id = 1
resource_type = Sound
irb e1/ar/self_association.rb
>> $: << File.dirname(__FILE__)
=> ["/home/rubys/svn/rexml/src", "/home/rubys/svn/html5lib/ruby/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/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.0722s
=> 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:0xb77ca724@/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__)
=> ["/home/rubys/svn/rexml/src", "/home/rubys/svn/html5lib/ruby/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/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:0xb784a7a8@/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:0xb7941bd4 @method=:add_to_list_bottom, @kind=:before_create, @identifier=nil, @options={}>]
?> 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__)
=> ["/home/rubys/svn/rexml/src", "/home/rubys/svn/html5lib/ruby/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/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.0684s
=> 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__)
=> ["/home/rubys/svn/rexml/src", "/home/rubys/svn/html5lib/ruby/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/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.0715s
-- create_table(:orders, {:force=>true})
-> 0.0080s
=> nil
?> class Order < ActiveRecord::Base
>> has_one :invoice
>> end
=> #<Proc:0xb785a248@/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:0xb785a248@/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-28 13:27:03">
>> order = Order.find(1)
=> #<Order id: 1, name: "Dave", email: "dave@xxx", address: "123 Main St", pay_type: "credit", shipped_at: "2009-05-28 13:27:03">
>> 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__)
=> ["/home/rubys/svn/rexml/src", "/home/rubys/svn/html5lib/ruby/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/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.0814s
-- create_table(:line_items, {:force=>true})
-> 0.0088s
=> nil
>> class Product < ActiveRecord::Base
>> has_many :line_items
>> end
=> #<Proc:0xb78676f0@/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:0xb7867204@/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__)
=> ["/home/rubys/svn/rexml/src", "/home/rubys/svn/html5lib/ruby/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/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.0728s
-- create_table(:users, {:force=>:true})
-> 0.0068s
=> 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@example.com"
=> "dave@example.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@example.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@fybnqmf.dpn
irb e1/ar/observer.rb
>> $: << File.dirname(__FILE__)
=> ["/home/rubys/svn/rexml/src", "/home/rubys/svn/html5lib/ruby/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/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:0xb7b19a74 @default_formatter=#<Logger::Formatter:0xb7b19a38 @datetime_format=nil>, @logdev=#<Logger::LogDevice:0xb7b199e8 @filename=nil, @shift_size=nil, @shift_age=nil, @dev=#<IO:0xb7ca4f74>, @mutex=#<Logger::LogDevice::LogDeviceMutex:0xb7b199ac @mon_owner=nil, @mon_waiting_queue=[], @mon_entering_queue=[], @mon_count=0>>, @level=0, @progname=nil, @formatter=nil>
>> ActiveRecord::Schema.define do
?> create_table :payments, :force => true do |t|
?> end
>> end
-- create_table(:payments, {:force=>true})
SQL (0.4ms) select sqlite_version(*)
SQL (1.8ms) *[0m SELECT name
FROM sqlite_master
WHERE type = 'table' AND NOT name = 'sqlite_sequence'
*[0m
SQL (3.4ms) CREATE TABLE "payments" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)
-> 0.0705s
=> 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:0xb7935d48>
?> 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:0xb7927a90>
>> o = Order.create
Order Create (0.4ms) INSERT INTO "orders" ("name", "user_id", "address", "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.4ms) INSERT INTO payments VALUES(NULL)
[Audit] Payment 1 created
=> #<Payment id: 1>
?> >>
irb e1/ar/attributes.rb
>> $: << File.dirname(__FILE__)
=> ["/home/rubys/svn/rexml/src", "/home/rubys/svn/html5lib/ruby/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/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:b7893fc0,'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:b7888698,'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:b787a9bc,'0.4495E2',8(8)>>
>> result = LineItem.find(:first)
=> #<LineItem id: 3, product_id: 27, order_id: 13, quantity: 1, unit_price: #<BigDecimal:b7873798,'0.2995E2',8(8)>>
>> p result.quantity
1
=> nil
>> p result.unit_price
#<BigDecimal:b786df64,'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
{"total_price"=>"29.95", "quantity"=>1}
=> 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__)
=> ["/home/rubys/svn/rexml/src", "/home/rubys/svn/html5lib/ruby/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/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.0813s
=> 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:b78b9b6c,'0.1E3',4(8)>>
>> paul = Account.create(:balance => 200, :number => "54321")
=> #<Account id: 2, number: "54321", balance: #<BigDecimal:b78afba8,'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__)
=> ["/home/rubys/svn/rexml/src", "/home/rubys/svn/html5lib/ruby/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/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.0816s
=> 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:b78fe578,'0.1E3',4(8)>>
>> paul = Account.create(:balance => 200, :number => "54321")
=> #<Account id: 2, number: "54321", balance: #<BigDecimal:b78f40a0,'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
>> >> => 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__)
=> ["/home/rubys/svn/rexml/src", "/home/rubys/svn/html5lib/ruby/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/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.0843s
=> 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:b789d5ac,'0.1E3',4(8)>>
>> paul = Account.create(:balance => 200, :number => "54321")
=> #<Account id: 2, number: "54321", balance: #<BigDecimal:b7893174,'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__)
=> ["/home/rubys/svn/rexml/src", "/home/rubys/svn/html5lib/ruby/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/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.0817s
=> 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:b78cc578,'0.1E3',4(8)>>
>> paul = Account.create(:balance => 200, :number => "54321")
=> #<Account id: 2, number: "54321", balance: #<BigDecimal:b78c20a0,'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__)
=> ["/home/rubys/svn/rexml/src", "/home/rubys/svn/html5lib/ruby/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/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.0812s
=> 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:b7923594,'0.1E3',4(8)>>
>> paul = Account.create(:balance => 200, :number => "54321")
=> #<Account id: 2, number: "54321", balance: #<BigDecimal:b79190f8,'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__)
=> ["/home/rubys/svn/rexml/src", "/home/rubys/svn/html5lib/ruby/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/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.0791s
=> 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/20090528172710_create_articles.rb
rake db:migrate
mv 20090528172710_create_articles.rb 20080601000001_create_articles.rb
(in /home/rubys/git/awdwr/work/restful)
== CreateArticles: migrating =================================================
-- create_table(:articles)
-> 0.0019s
== CreateArticles: migrated (0.0020s) ========================================
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"}
embargo_article PUT /articles/:id/embargo(.:format) {:controller=>"articles", :action=>"embargo"}
release_article PUT /articles/:id/release(.:format) {:controller=>"articles", :action=>"release"}
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"}
new_article GET /articles/new(.:format) {:controller=>"articles", :action=>"new"}
shortform_new_article POST /articles/new/shortform(.:format) {:controller=>"articles", :action=>"shortform"}
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/20090528172719_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 20090528172719_create_comments.rb 20080601000002_create_comments.rb
(in /home/rubys/git/awdwr/work/restful)
== CreateComments: migrating =================================================
-- create_table(:comments)
-> 0.0020s
== CreateComments: migrated (0.0021s) ========================================
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/helpers/store_helper_test.rb" "test/unit/routing_conditions_test.rb" "test/unit/routing_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.083573 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.051132 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:0xb77c6958 @named_routes=#<ActionController::Routing::RouteSet::NamedRouteCollection:0xb77beaf0 @module=#<Module:0xb77be6b8>, @routes={:products=>#<ActionController::Routing::Route:0xb7735a70 @to_s="GET /products(.:format)? {:action=>\"index\", :controller=>\"products\"}", @optimise=true, @parameter_shell={:action=>"index", :controller=>"products"}, @conditions={:method=>:get}, @segments=[#<ActionController::Routing::DividerSegment:0xb7735f34 @is_optional=false, @raw=true, @value="/">, #<ActionController::Routing::StaticSegment:0xb7735e94 @is_optional=false, @value="products">, #<ActionController::Routing::OptionalFormatSegment:0xb7735e1c @is_optional=true, @key=:format>], @action_requirement="index", @controller_requirement="products", @defaults={:action=>"index", :controller=>"products"}, @matching_prepared=true, @significant_keys=[:format, :action, :controller], @requirements={:action=>"index", :controller=>"products"}>, :edit_product=>#<ActionController::Routing::Route:0xb772164c @to_s="GET /products/:id/edit(.:format)? {:action=>\"edit\", :controller=>\"products\"}", @optimise=false, @parameter_shell={:action=>"edit", :controller=>"products"}, @conditions={:method=>:get}, @segments=[#<ActionController::Routing::DividerSegment:0xb7721f84 @is_optional=false, @raw=true, @value="/">, #<ActionController::Routing::StaticSegment:0xb7721ee4 @is_optional=false, @value="products">, #<ActionController::Routing::DividerSegment:0xb7721e30 @is_optional=false, @raw=true, @value="/">, #<ActionController::Routing::DynamicSegment:0xb7721d90 @is_optional=false, @key=:id, @regexp=/[^\/.?]+/>, #<ActionController::Routing::DividerSegment:0xb7721cdc @is_optional=false, @raw=true, @value="/">, #<ActionController::Routing::StaticSegment:0xb7721c3c @is_optional=false, @value="edit">, #<ActionController::Routing::OptionalFormatSegment:0xb7721bc4 @is_optional=true, @key=:format>], @action_requirement="edit", @controller_requirement="products", @defaults={:action=>"edit", :controller=>"products"}, @matching_prepared=true, @significant_keys=[:id, :format, :action, :controller], @requirements={:action=>"edit", :controller=>"products"}>, :new_order=>#<ActionController::Routing::Route:0xb775062c @to_s="GET /orders/new(.:format)? {:action=>\"new\", :controller=>\"orders\"}", @optimise=true, @parameter_shell={:action=>"new", :controller=>"orders"}, @conditions={:method=>:get}, @segments=[#<ActionController::Routing::DividerSegment:0xb7750c94 @is_optional=false, @raw=true, @value="/">, #<ActionController::Routing::StaticSegment:0xb7750bf4 @is_optional=false, @value="orders">, #<ActionController::Routing::DividerSegment:0xb7750b40 @is_optional=false, @raw=true, @value="/">, #<ActionController::Routing::StaticSegment:0xb7750aa0 @is_optional=false, @value="new">, #<ActionController::Routing::OptionalFormatSegment:0xb7750a28 @is_optional=true, @key=:format>], @action_requirement="new", @controller_requirement="orders", @defaults={:action=>"new", :controller=>"orders"}, @matching_prepared=true, @significant_keys=[:format, :action, :controller], @requirements={:action=>"new", :controller=>"orders"}>, :new_line_item=>#<ActionController::Routing::Route:0xb7a574b0 @to_s="GET /line_items/new(.:format)? {:action=>\"new\", :controller=>\"line_items\"}", @optimise=true, @parameter_shell={:action=>"new", :controller=>"line_items"}, @conditions={:method=>:get}, @segments=[#<ActionController::Routing::DividerSegment:0xb7a582ac @is_optional=false, @raw=true, @value="/">, #<ActionController::Routing::StaticSegment:0xb7a581f8 @is_optional=false, @value="line_items">, #<ActionController::Routing::DividerSegment:0xb7a580a4 @is_optional=false, @raw=true, @value="/">, #<ActionController::Routing::StaticSegment:0xb7a57ff0 @is_optional=false, @value="new">, #<ActionController::Routing::OptionalFormatSegment:0xb7a57f78 @is_optional=true, @key=:format>], @action_requirement="new", @controller_requirement="line_items", @defaults={:action=>"new", :controller=>"line_items"}, @matching_prepared=true, @significant_keys=[:format, :action, :controller], @requirements={:action=>"new", :controller=>"line_items"}>, :user=>#<ActionController::Routing::Route:0xb7ae6160 @to_s="GET /users/:id(.:format)? {:action=>\"show\", :controller=>\"users\"}", @optimise=false, @parameter_shell={:action=>"show", :controller=>"users"}, @conditions={:method=>:get}, @segments=[#<ActionController::Routing::DividerSegment:0xb7aeac88 @is_optional=false, @raw=true, @value="/">, #<ActionController::Routing::StaticSegment:0xb7aeab84 @is_optional=false, @value="users">, #<ActionController::Routing::DividerSegment:0xb7aeaa44 @is_optional=false, @raw=true, @value="/">, #<ActionController::Routing::DynamicSegment:0xb7ae9d4c @is_optional=false, @key=:id, @regexp=/[^\/.?]+/>, #<ActionController::Routing::OptionalFormatSegment:0xb7ae9ae0 @is_optional=true, @key=:format>], @action_requirement="show", @controller_requirement="users", @defaults={:action=>"show", :controller=>"users"}, @matching_prepared=true, @significant_keys=[:id, :format, :action, :controller], @requirements={:action=>"show", :controller=>"users"}>, :new_user=>#<ActionController::Routing::Route:0xb7791d98 @to_s="GET /users/new(.:format)? {:action=>\"new\", :controller=>\"users\"}", @optimise=true, @parameter_shell={:action=>"new", :controller=>"users"}, @conditions={:method=>:get}, @segments=[#<ActionController::Routing::DividerSegment:0xb7792e28 @is_optional=false, @raw=true, @value="/">, #<ActionController::Routing::StaticSegment:0xb7792d88 @is_optional=false, @value="users">, #<ActionController::Routing::DividerSegment:0xb7792cc0 @is_optional=false, @raw=true, @value="/">, #<ActionController::Routing::StaticSegment:0xb7792bd0 @is_optional=false, @value="new">, #<ActionController::Routing::OptionalFormatSegment:0xb7792b44 @is_optional=true, @key=:format>], @action_requirement="new", @controller_requirement="users", @defaults={:action=>"new", :controller=>"users"}, @matching_prepared=true, @significant_keys=[:format, :action, :controller], @requirements={:action=>"new", :controller=>"users"}>, :product=>#<ActionController::Routing::Route:0xb771baf8 @to_s="GET /products/:id(.:format)? {:action=>\"show\", :controller=>\"products\"}", @optimise=false, @parameter_shell={:action=>"show", :controller=>"products"}, @conditions={:method=>:get}, @segments=[#<ActionController::Routing::DividerSegment:0xb771c28c @is_optional=false, @raw=true, @value="/">, #<ActionController::Routing::StaticSegment:0xb771c1ec @is_optional=false, @value="products">, #<ActionController::Routing::DividerSegment:0xb771c138 @is_optional=false, @raw=true, @value="/">, #<ActionController::Routing::DynamicSegment:0xb771c098 @is_optional=false, @key=:id, @regexp=/[^\/.?]+/>, #<ActionController::Routing::OptionalFormatSegment:0xb771c020 @is_optional=true, @key=:format>], @action_requirement="show", @controller_requirement="products", @defaults={:action=>"show", :controller=>"products"}, @matching_prepared=true, @significant_keys=[:id, :format, :action, :controller], @requirements={:action=>"show", :controller=>"products"}>, :edit_order=>#<ActionController::Routing::Route:0xb7747270 @to_s="GET /orders/:id/edit(.:format)? {:action=>\"edit\", :controller=>\"orders\"}", @optimise=false, @parameter_shell={:action=>"edit", :controller=>"orders"}, @conditions={:method=>:get}, @segments=[#<ActionController::Routing::DividerSegment:0xb7747ba8 @is_optional=false, @raw=true, @value="/">, #<ActionController::Routing::StaticSegment:0xb7747b08 @is_optional=false, @value="orders">, #<ActionController::Routing::DividerSegment:0xb7747a54 @is_optional=false, @raw=true, @value="/">, #<ActionController::Routing::DynamicSegment:0xb77479b4 @is_optional=false, @key=:id, @regexp=/[^\/.?]+/>, #<ActionController::Routing::DividerSegment:0xb7747900 @is_optional=false, @raw=true, @value="/">, #<ActionController::Routing::StaticSegment:0xb7747860 @is_optional=false, @value="edit">, #<ActionController::Routing::OptionalFormatSegment:0xb77477e8 @is_optional=true, @key=:format>], @action_requirement="edit", @controller_requirement="orders", @defaults={:action=>"edit", :controller=>"orders"}, @matching_prepared=true, @significant_keys=[:id, :format, :action, :controller], @requirements={:action=>"edit", :controller=>"orders"}>, :edit_line_item=>#<ActionController::Routing::Route:0xb7a252bc @to_s="GET /line_items/:id/edit(.:format)? {:action=>\"edit\", :controller=>\"line_items\"}", @optimise=false, @parameter_shell={:action=>"edit", :controller=>"line_items"}, @conditions={:method=>:get}, @segments=[#<ActionController::Routing::DividerSegment:0xb7a2701c @is_optional=false, @raw=true, @value="/">, #<ActionController::Routing::StaticSegment:0xb7a26e78 @is_optional=false, @value="line_items">, #<ActionController::Routing::DividerSegment:0xb7a26b80 @is_optional=false, @raw=true, @value="/">, #<ActionController::Routing::DynamicSegment:0xb7a26450 @is_optional=false, @key=:id, @regexp=/[^\/.?]+/>, #<ActionController::Routing::DividerSegment:0xb7a2634c @is_optional=false, @raw=true, @value="/">, #<ActionController::Routing::StaticSegment:0xb7a25cd0 @is_optional=false, @value="edit">, #<ActionController::Routing::OptionalFormatSegment:0xb7a25c44 @is_optional=true, @key=:format>], @action_requirement="edit", @controller_requirement="line_items", @defaults={:action=>"edit", :controller=>"line_items"}, @matching_prepared=true, @significant_keys=[:id, :format, :action, :controller], @requirements={:action=>"edit", :controller=>"line_items"}>, :users=>#<ActionController::Routing::Route:0xb77b3c54 @to_s="GET /users(.:format)? {:action=>\"index\", :controller=>\"users\"}", @optimise=true, @parameter_shell={:action=>"index", :controller=>"users"}, @conditions={:method=>:get}, @segments=[#<ActionController::Routing::DividerSegment:0xb77b4b90 @is_optional=false, @raw=true, @value="/">, #<ActionController::Routing::StaticSegment:0xb77b4604 @is_optional=false, @value="users">, #<ActionController::Routing::OptionalFormatSegment:0xb77b458c @is_optional=true, @key=:format>], @action_requirement="index", @controller_requirement="users", @defaults={:action=>"index", :controller=>"users"}, @matching_prepared=true, @significant_keys=[:format, :action, :controller], @requirements={:action=>"index", :controller=>"users"}>, :edit_user=>#<ActionController::Routing::Route:0xb7b19a4c @to_s="GET /users/:id/edit(.:format)? {:action=>\"edit\", :controller=>\"users\"}", @optimise=false, @parameter_shell={:action=>"edit", :controller=>"users"}, @conditions={:method=>:get}, @segments=[#<ActionController::Routing::DividerSegment:0xb7b1ad84 @is_optional=false, @raw=true, @value="/">, #<ActionController::Routing::StaticSegment:0xb7b1ab7c @is_optional=false, @value="users">, #<ActionController::Routing::DividerSegment:0xb7b1aa50 @is_optional=false, @raw=true, @value="/">, #<ActionController::Routing::DynamicSegment:0xb7b1a94c @is_optional=false, @key=:id, @regexp=/[^\/.?]+/>, #<ActionController::Routing::DividerSegment:0xb7b1a7bc @is_optional=false, @raw=true, @value="/">, #<ActionController::Routing::StaticSegment:0xb7b1a690 @is_optional=false, @value="edit">, #<ActionController::Routing::OptionalFormatSegment:0xb7b1a528 @is_optional=true, @key=:format>], @action_requirement="edit", @controller_requirement="users", @defaults={:action=>"edit", :controller=>"users"}, @matching_prepared=true, @significant_keys=[:id, :format, :action, :controller], @requirements={:action=>"edit", :controller=>"users"}>, :line_items=>#<ActionController::Routing::Route:0xb7a86198 @to_s="GET /line_items(.:format)? {:action=>\"index\", :controller=>\"line_items\"}", @optimise=true, @parameter_shell={:action=>"index", :controller=>"line_items"}, @conditions={:method=>:get}, @segments=[#<ActionController::Routing::DividerSegment:0xb7a86b84 @is_optional=false, @raw=true, @value="/">, #<ActionController::Routing::StaticSegment:0xb7a86634 @is_optional=false, @value="line_items">, #<ActionController::Routing::OptionalFormatSegment:0xb7a865bc @is_optional=true, @key=:format>], @action_requirement="index", @controller_requirement="line_items", @defaults={:action=>"index", :controller=>"line_items"}, @matching_prepared=true, @significant_keys=[:format, :action, :controller], @requirements={:action=>"index", :controller=>"line_items"}>, :line_item=>#<ActionController::Routing::Route:0xb7bb7a08 @to_s="GET /line_items/:id(.:format)? {:action=>\"show\", :controller=>\"line_items\"}", @optimise=false, @parameter_shell={:action=>"show", :controller=>"line_items"}, @conditions={:method=>:get}, @segments=[#<ActionController::Routing::DividerSegment:0xb7bc0554 @is_optional=false, @raw=true, @value="/">, #<ActionController::Routing::StaticSegment:0xb7bbfec4 @is_optional=false, @value="line_items">, #<ActionController::Routing::DividerSegment:0xb7bbfc94 @is_optional=false, @raw=true, @value="/">, #<ActionController::Routing::DynamicSegment:0xb7bbf7bc @is_optional=false, @key=:id, @regexp=/[^\/.?]+/>, #<ActionController::Routing::OptionalFormatSegment:0xb7bbec54 @is_optional=true, @key=:format>], @action_requirement="show", @controller_requirement="line_items", @defaults={:action=>"show", :controller=>"line_items"}, @matching_prepared=true, @significant_keys=[:id, :format, :action, :controller], @requirements={:action=>"show", :controller=>"line_items"}>, :new_product=>#<ActionController::Routing::Route:0xb772aa08 @to_s="GET /products/new(.:format)? {:action=>\"new\", :controller=>\"products\"}", @optimise=true, @parameter_shell={:action=>"new", :controller=>"products"}, @conditions={:method=>:get}, @segments=[#<ActionController::Routing::DividerSegment:0xb772b070 @is_optional=false, @raw=true, @value="/">, #<ActionController::Routing::StaticSegment:0xb772afd0 @is_optional=false, @value="products">, #<ActionController::Routing::DividerSegment:0xb772af1c @is_optional=false, @raw=true, @value="/">, #<ActionController::Routing::StaticSegment:0xb772ae7c @is_optional=false, @value="new">, #<ActionController::Routing::OptionalFormatSegment:0xb772ae04 @is_optional=true, @key=:format>], @action_requirement="new", @controller_requirement="products", @defaults={:action=>"new", :controller=>"products"}, @matching_prepared=true, @significant_keys=[:format, :action, :controller], @requirements={:action=>"new", :controller=>"products"}>, :orders=>#<ActionController::Routing::Route:0xb775b694 @to_s="GET /orders(.:format)? {:action=>\"index\", :controller=>\"orders\"}", @optimise=true, @parameter_shell={:action=>"index", :controller=>"orders"}, @conditions={:method=>:get}, @segments=[#<ActionController::Routing::DividerSegment:0xb775bb58 @is_optional=false, @raw=true, @value="/">, #<ActionController::Routing::StaticSegment:0xb775bab8 @is_optional=false, @value="orders">, #<ActionController::Routing::OptionalFormatSegment:0xb775ba40 @is_optional=true, @key=:format>], @action_requirement="index", @controller_requirement="orders", @defaults={:action=>"index", :controller=>"orders"}, @matching_prepared=true, @significant_keys=[:format, :action, :controller], @requirements={:action=>"index", :controller=>"orders"}>, :order=>#<ActionController::Routing::Route:0xb774171c @to_s="GET /orders/:id(.:format)? {:action=>\"show\", :controller=>\"orders\"}", @optimise=false, @parameter_shell={:action=>"show", :controller=>"orders"}, @conditions={:method=>:get}, @segments=[#<ActionController::Routing::DividerSegment:0xb7741eb0 @is_optional=false, @raw=true, @value="/">, #<ActionController::Routing::StaticSegment:0xb7741e10 @is_optional=false, @value="orders">, #<ActionController::Routing::DividerSegment:0xb7741d5c @is_optional=false, @raw=true, @value="/">, #<ActionController::Routing::DynamicSegment:0xb7741cbc @is_optional=false, @key=:id, @regexp=/[^\/.?]+/>, #<ActionController::Routing::OptionalFormatSegment:0xb7741c44 @is_optional=true, @key=:format>], @action_requirement="show", @controller_requirement="orders", @defaults={:action=>"show", :controller=>"orders"}, @matching_prepared=true, @significant_keys=[:id, :format, :action, :controller], @requirements={:action=>"show", :controller=>"orders"}>}, @helpers=[:hash_for_users_path, :users_path, :hash_for_users_url, :users_url, :hash_for_new_user_path, :new_user_path, :hash_for_new_user_url, :new_user_url, :hash_for_edit_user_path, :edit_user_path, :hash_for_edit_user_url, :edit_user_url, :hash_for_user_path, :user_path, :hash_for_user_url, :user_url, :hash_for_line_items_path, :line_items_path, :hash_for_line_items_url, :line_items_url, :hash_for_new_line_item_path, :new_line_item_path, :hash_for_new_line_item_url, :new_line_item_url, :hash_for_edit_line_item_path, :edit_line_item_path, :hash_for_edit_line_item_url, :edit_line_item_url, :hash_for_line_item_path, :line_item_path, :hash_for_line_item_url, :line_item_url, :hash_for_orders_path, :orders_path, :hash_for_orders_url, :orders_url, :hash_for_new_order_path, :new_order_path, :hash_for_new_order_url, :new_order_url, :hash_for_edit_order_path, :edit_order_path, :hash_for_edit_order_url, :edit_order_url, :hash_for_order_path, :order_path, :hash_for_order_url, :order_url, :hash_for_products_path, :products_path, :hash_for_products_url, :products_url, :hash_for_new_product_path, :new_product_path, :hash_for_new_product_url, :new_product_url, :hash_for_edit_product_path, :edit_product_path, :hash_for_edit_product_url, :edit_product_url, :hash_for_product_path, :product_path, :hash_for_product_url, :product_url]>, @builder=#<ActionController::Routing::RouteBuilder:0xb77b4dc0 @optional_separators=["/"], @interval_regexp=/(.*?)((?-mix:[\/\.\?])|$)/, @separators=["/", ".", "?"], @nonseparator_regexp=/\A([^\/\.\?]+)/, @separator_regexp=/[\/\.\?]/>, @routes=[#<ActionController::Routing::Route:0xb77b3c54 @to_s="GET /users(.:format)? {:action=>\"index\", :controller=>\"users\"}", @optimise=true, @parameter_shell={:action=>"index", :controller=>"users"}, @conditions={:method=>:get}, @segments=[#<ActionController::Routing::DividerSegment:0xb77b4b90 @is_optional=false, @raw=true, @value="/">, #<ActionController::Routing::StaticSegment:0xb77b4604 @is_optional=false, @value="users">, #<ActionController::Routing::OptionalFormatSegment:0xb77b458c @is_optional=true, @key=:format>], @action_requirement="index", @controller_requirement="users", @defaults={:action=>"index", :controller=>"users"}, @matching_prepared=true, @significant_keys=[:format, :action, :controller], @requirements={:action=>"index", :controller=>"users"}>, #<ActionController::Routing::Route:0xb7797b08 @to_s="POST /users(.:format)? {:action=>\"create\", :controller=>\"users\"}", @optimise=true, @parameter_shell={:action=>"create", :controller=>"users"}, @conditions={:method=>:post}, @segments=[#<ActionController::Routing::DividerSegment:0xb779a268 @is_optional=false, @raw=true, @value="/">, #<ActionController::Routing::StaticSegment:0xb779a060 @is_optional=false, @value="users">, #<ActionController::Routing::OptionalFormatSegment:0xb7799e44 @is_optional=true, @key=:format>], @action_requirement="create", @controller_requirement="users", @defaults={:action=>"create", :controller=>"users"}, @matching_prepared=true, @significant_keys=[:format, :action, :controller], @requirements={:action=>"create", :controller=>"users"}>, #<ActionController::Routing::Route:0xb7791d98 @to_s="GET /users/new(.:format)? {:action=>\"new\", :controller=>\"users\"}", @optimise=true, @parameter_shell={:action=>"new", :controller=>"users"}, @conditions={:method=>:get}, @segments=[#<ActionController::Routing::DividerSegment:0xb7792e28 @is_optional=false, @raw=true, @value="/">, #<ActionController::Routing::StaticSegment:0xb7792d88 @is_optional=false, @value="users">, #<ActionController::Routing::DividerSegment:0xb7792cc0 @is_optional=false, @raw=true, @value="/">, #<ActionController::Routing::StaticSegment:0xb7792bd0 @is_optional=false, @value="new">, #<ActionController::Routing::OptionalFormatSegment:0xb7792b44 @is_optional=true, @key=:format>], @action_requirement="new", @controller_requirement="users", @defaults={:action=>"new", :controller=>"users"}, @matching_prepared=true, @significant_keys=[:format, :action, :controller], @requirements={:action=>"new", :controller=>"users"}>, #<ActionController::Routing::Route:0xb7b19a4c @to_s="GET /users/:id/edit(.:format)? {:action=>\"edit\", :controller=>\"users\"}", @optimise=false, @parameter_shell={:action=>"edit", :controller=>"users"}, @conditions={:method=>:get}, @segments=[#<ActionController::Routing::DividerSegment:0xb7b1ad84 @is_optional=false, @raw=true, @value="/">, #<ActionController::Routing::StaticSegment:0xb7b1ab7c @is_optional=false, @value="users">, #<ActionController::Routing::DividerSegment:0xb7b1aa50 @is_optional=false, @raw=true, @value="/">, #<ActionController::Routing::DynamicSegment:0xb7b1a94c @is_optional=false, @key=:id, @regexp=/[^\/.?]+/>, #<ActionController::Routing::DividerSegment:0xb7b1a7bc @is_optional=false, @raw=true, @value="/">, #<ActionController::Routing::StaticSegment:0xb7b1a690 @is_optional=false, @value="edit">, #<ActionController::Routing::OptionalFormatSegment:0xb7b1a528 @is_optional=true, @key=:format>], @action_requirement="edit", @controller_requirement="users", @defaults={:action=>"edit", :controller=>"users"}, @matching_prepared=true, @significant_keys=[:id, :format, :action, :controller], @requirements={:action=>"edit", :controller=>"users"}>, #<ActionController::Routing::Route:0xb7ae6160 @to_s="GET /users/:id(.:format)? {:action=>\"show\", :controller=>\"users\"}", @optimise=false, @parameter_shell={:action=>"show", :controller=>"users"}, @conditions={:method=>:get}, @segments=[#<ActionController::Routing::DividerSegment:0xb7aeac88 @is_optional=false, @raw=true, @value="/">, #<ActionController::Routing::StaticSegment:0xb7aeab84 @is_optional=false, @value="users">, #<ActionController::Routing::DividerSegment:0xb7aeaa44 @is_optional=false, @raw=true, @value="/">, #<ActionController::Routing::DynamicSegment:0xb7ae9d4c @is_optional=false, @key=:id, @regexp=/[^\/.?]+/>, #<ActionController::Routing::OptionalFormatSegment:0xb7ae9ae0 @is_optional=true, @key=:format>], @action_requirement="show", @controller_requirement="users", @defaults={:action=>"show", :controller=>"users"}, @matching_prepared=true, @significant_keys=[:id, :format, :action, :controller], @requirements={:action=>"show", :controller=>"users"}>, #<ActionController::Routing::Route:0xb7ab1924 @to_s="PUT /users/:id(.:format)? {:action=>\"update\", :controller=>\"users\"}", @optimise=false, @parameter_shell={:action=>"update", :controller=>"users"}, @conditions={:method=>:put}, @segments=[#<ActionController::Routing::DividerSegment:0xb7ab5e70 @is_optional=false, @raw=true, @value="/">, #<ActionController::Routing::StaticSegment:0xb7ab47dc @is_optional=false, @value="users">, #<ActionController::Routing::DividerSegment:0xb7ab36e8 @is_optional=false, @raw=true, @value="/">, #<ActionController::Routing::DynamicSegment:0xb7ab3544 @is_optional=false, @key=:id, @regexp=/[^\/.?]+/>, #<ActionController::Routing::OptionalFormatSegment:0xb7ab34b8 @is_optional=true, @key=:format>], @action_requirement="update", @controller_requirement="users", @defaults={:action=>"update", :controller=>"users"}, @matching_prepared=true, @significant_keys=[:id, :format, :action, :controller], @requirements={:action=>"update", :controller=>"users"}>, #<ActionController::Routing::Route:0xb7a9adc8 @to_s="DELETE /users/:id(.:format)? {:action=>\"destroy\", :controller=>\"users\"}", @optimise=false, @parameter_shell={:action=>"destroy", :controller=>"users"}, @conditions={:method=>:delete}, @segments=[#<ActionController::Routing::DividerSegment:0xb7a9dc6c @is_optional=false, @raw=true, @value="/">, #<ActionController::Routing::StaticSegment:0xb7a9da28 @is_optional=false, @value="users">, #<ActionController::Routing::DividerSegment:0xb7a9d58c @is_optional=false, @raw=true, @value="/">, #<ActionController::Routing::DynamicSegment:0xb7a9d49c @is_optional=false, @key=:id, @regexp=/[^\/.?]+/>, #<ActionController::Routing::OptionalFormatSegment:0xb7a9d2e4 @is_optional=true, @key=:format>], @action_requirement="destroy", @controller_requirement="users", @defaults={:action=>"destroy", :controller=>"users"}, @matching_prepared=true, @significant_keys=[:id, :format, :action, :controller], @requirements={:action=>"destroy", :controller=>"users"}>, #<ActionController::Routing::Route:0xb7a86198 @to_s="GET /line_items(.:format)? {:action=>\"index\", :controller=>\"line_items\"}", @optimise=true, @parameter_shell={:action=>"index", :controller=>"line_items"}, @conditions={:method=>:get}, @segments=[#<ActionController::Routing::DividerSegment:0xb7a86b84 @is_optional=false, @raw=true, @value="/">, #<ActionController::Routing::StaticSegment:0xb7a86634 @is_optional=false, @value="line_items">, #<ActionController::Routing::OptionalFormatSegment:0xb7a865bc @is_optional=true, @key=:format>], @action_requirement="index", @controller_requirement="line_items", @defaults={:action=>"index", :controller=>"line_items"}, @matching_prepared=true, @significant_keys=[:format, :action, :controller], @requirements={:action=>"index", :controller=>"line_items"}>, #<ActionController::Routing::Route:0xb7a61668 @to_s="POST /line_items(.:format)? {:action=>\"create\", :controller=>\"line_items\"}", @optimise=true, @parameter_shell={:action=>"create", :controller=>"line_items"}, @conditions={:method=>:post}, @segments=[#<ActionController::Routing::DividerSegment:0xb7a61b40 @is_optional=false, @raw=true, @value="/">, #<ActionController::Routing::StaticSegment:0xb7a61aa0 @is_optional=false, @value="line_items">, #<ActionController::Routing::OptionalFormatSegment:0xb7a61a28 @is_optional=true, @key=:format>], @action_requirement="create", @controller_requirement="line_items", @defaults={:action=>"create", :controller=>"line_items"}, @matching_prepared=true, @significant_keys=[:format, :action, :controller], @requirements={:action=>"create", :controller=>"line_items"}>, #<ActionController::Routing::Route:0xb7a574b0 @to_s="GET /line_items/new(.:format)? {:action=>\"new\", :controller=>\"line_items\"}", @optimise=true, @parameter_shell={:action=>"new", :controller=>"line_items"}, @conditions={:method=>:get}, @segments=[#<ActionController::Routing::DividerSegment:0xb7a582ac @is_optional=false, @raw=true, @value="/">, #<ActionController::Routing::StaticSegment:0xb7a581f8 @is_optional=false, @value="line_items">, #<ActionController::Routing::DividerSegment:0xb7a580a4 @is_optional=false, @raw=true, @value="/">, #<ActionController::Routing::StaticSegment:0xb7a57ff0 @is_optional=false, @value="new">, #<ActionController::Routing::OptionalFormatSegment:0xb7a57f78 @is_optional=true, @key=:format>], @action_requirement="new", @controller_requirement="line_items", @defaults={:action=>"new", :controller=>"line_items"}, @matching_prepared=true, @significant_keys=[:format, :action, :controller], @requirements={:action=>"new", :controller=>"line_items"}>, #<ActionController::Routing::Route:0xb7a252bc @to_s="GET /line_items/:id/edit(.:format)? {:action=>\"edit\", :controller=>\"line_items\"}", @optimise=false, @parameter_shell={:action=>"edit", :controller=>"line_items"}, @conditions={:method=>:get}, @segments=[#<ActionController::Routing::DividerSegment:0xb7a2701c @is_optional=false, @raw=true, @value="/">, #<ActionController::Routing::StaticSegment:0xb7a26e78 @is_optional=false, @value="line_items">, #<ActionController::Routing::DividerSegment:0xb7a26b80 @is_optional=false, @raw=true, @value="/">, #<ActionController::Routing::DynamicSegment:0xb7a26450 @is_optional=false, @key=:id, @regexp=/[^\/.?]+/>, #<ActionController::Routing::DividerSegment:0xb7a2634c @is_optional=false, @raw=true, @value="/">, #<ActionController::Routing::StaticSegment:0xb7a25cd0 @is_optional=false, @value="edit">, #<ActionController::Routing::OptionalFormatSegment:0xb7a25c44 @is_optional=true, @key=:format>], @action_requirement="edit", @controller_requirement="line_items", @defaults={:action=>"edit", :controller=>"line_items"}, @matching_prepared=true, @significant_keys=[:id, :format, :action, :controller], @requirements={:action=>"edit", :controller=>"line_items"}>, #<ActionController::Routing::Route:0xb7bb7a08 @to_s="GET /line_items/:id(.:format)? {:action=>\"show\", :controller=>\"line_items\"}", @optimise=false, @parameter_shell={:action=>"show", :controller=>"line_items"}, @conditions={:method=>:get}, @segments=[#<ActionController::Routing::DividerSegment:0xb7bc0554 @is_optional=false, @raw=true, @value="/">, #<ActionController::Routing::StaticSegment:0xb7bbfec4 @is_optional=false, @value="line_items">, #<ActionController::Routing::DividerSegment:0xb7bbfc94 @is_optional=false, @raw=true, @value="/">, #<ActionController::Routing::DynamicSegment:0xb7bbf7bc @is_optional=false, @key=:id, @regexp=/[^\/.?]+/>, #<ActionController::Routing::OptionalFormatSegment:0xb7bbec54 @is_optional=true, @key=:format>], @action_requirement="show", @controller_requirement="line_items", @defaults={:action=>"show", :controller=>"line_items"}, @matching_prepared=true, @significant_keys=[:id, :format, :action, :controller], @requirements={:action=>"show", :controller=>"line_items"}>, #<ActionController::Routing::Route:0xb77618b4 @to_s="PUT /line_items/:id(.:format)? {:action=>\"update\", :controller=>\"line_items\"}", @optimise=false, @parameter_shell={:action=>"update", :controller=>"line_items"}, @conditions={:method=>:put}, @segments=[#<ActionController::Routing::DividerSegment:0xb7762048 @is_optional=false, @raw=true, @value="/">, #<ActionController::Routing::StaticSegment:0xb7761fa8 @is_optional=false, @value="line_items">, #<ActionController::Routing::DividerSegment:0xb7761ef4 @is_optional=false, @raw=true, @value="/">, #<ActionController::Routing::DynamicSegment:0xb7761e54 @is_optional=false, @key=:id, @regexp=/[^\/.?]+/>, #<ActionController::Routing::OptionalFormatSegment:0xb7761ddc @is_optional=true, @key=:format>], @action_requirement="update", @controller_requirement="line_items", @defaults={:action=>"update", :controller=>"line_items"}, @matching_prepared=true, @significant_keys=[:id, :format, :action, :controller], @requirements={:action=>"update", :controller=>"line_items"}>, #<ActionController::Routing::Route:0xb775e858 @to_s="DELETE /line_items/:id(.:format)? {:action=>\"destroy\", :controller=>\"line_items\"}", @optimise=false, @parameter_shell={:action=>"destroy", :controller=>"line_items"}, @conditions={:method=>:delete}, @segments=[#<ActionController::Routing::DividerSegment:0xb775efec @is_optional=false, @raw=true, @value="/">, #<ActionController::Routing::StaticSegment:0xb775ef4c @is_optional=false, @value="line_items">, #<ActionController::Routing::DividerSegment:0xb775ee98 @is_optional=false, @raw=true, @value="/">, #<ActionController::Routing::DynamicSegment:0xb775edf8 @is_optional=false, @key=:id, @regexp=/[^\/.?]+/>, #<ActionController::Routing::OptionalFormatSegment:0xb775ed80 @is_optional=true, @key=:format>], @action_requirement="destroy", @controller_requirement="line_items", @defaults={:action=>"destroy", :controller=>"line_items"}, @matching_prepared=true, @significant_keys=[:id, :format, :action, :controller], @requirements={:action=>"destroy", :controller=>"line_items"}>, #<ActionController::Routing::Route:0xb775b694 @to_s="GET /orders(.:format)? {:action=>\"index\", :controller=>\"orders\"}", @optimise=true, @parameter_shell={:action=>"index", :controller=>"orders"}, @conditions={:method=>:get}, @segments=[#<ActionController::Routing::DividerSegment:0xb775bb58 @is_optional=false, @raw=true, @value="/">, #<ActionController::Routing::StaticSegment:0xb775bab8 @is_optional=false, @value="orders">, #<ActionController::Routing::OptionalFormatSegment:0xb775ba40 @is_optional=true, @key=:format>], @action_requirement="index", @controller_requirement="orders", @defaults={:action=>"index", :controller=>"orders"}, @matching_prepared=true, @significant_keys=[:format, :action, :controller], @requirements={:action=>"index", :controller=>"orders"}>, #<ActionController::Routing::Route:0xb7752a30 @to_s="POST /orders(.:format)? {:action=>\"create\", :controller=>\"orders\"}", @optimise=true, @parameter_shell={:action=>"create", :controller=>"orders"}, @conditions={:method=>:post}, @segments=[#<ActionController::Routing::DividerSegment:0xb7752ef4 @is_optional=false, @raw=true, @value="/">, #<ActionController::Routing::StaticSegment:0xb7752e54 @is_optional=false, @value="orders">, #<ActionController::Routing::OptionalFormatSegment:0xb7752ddc @is_optional=true, @key=:format>], @action_requirement="create", @controller_requirement="orders", @defaults={:action=>"create", :controller=>"orders"}, @matching_prepared=true, @significant_keys=[:format, :action, :controller], @requirements={:action=>"create", :controller=>"orders"}>, #<ActionController::Routing::Route:0xb775062c @to_s="GET /orders/new(.:format)? {:action=>\"new\", :controller=>\"orders\"}", @optimise=true, @parameter_shell={:action=>"new", :controller=>"orders"}, @conditions={:method=>:get}, @segments=[#<ActionController::Routing::DividerSegment:0xb7750c94 @is_optional=false, @raw=true, @value="/">, #<ActionController::Routing::StaticSegment:0xb7750bf4 @is_optional=false, @value="orders">, #<ActionController::Routing::DividerSegment:0xb7750b40 @is_optional=false, @raw=true, @value="/">, #<ActionController::Routing::StaticSegment:0xb7750aa0 @is_optional=false, @value="new">, #<ActionController::Routing::OptionalFormatSegment:0xb7750a28 @is_optional=true, @key=:format>], @action_requirement="new", @controller_requirement="orders", @defaults={:action=>"new", :controller=>"orders"}, @matching_prepared=true, @significant_keys=[:format, :action, :controller], @requirements={:action=>"new", :controller=>"orders"}>, #<ActionController::Routing::Route:0xb7747270 @to_s="GET /orders/:id/edit(.:format)? {:action=>\"edit\", :controller=>\"orders\"}", @optimise=false, @parameter_shell={:action=>"edit", :controller=>"orders"}, @conditions={:method=>:get}, @segments=[#<ActionController::Routing::DividerSegment:0xb7747ba8 @is_optional=false, @raw=true, @value="/">, #<ActionController::Routing::StaticSegment:0xb7747b08 @is_optional=false, @value="orders">, #<ActionController::Routing::DividerSegment:0xb7747a54 @is_optional=false, @raw=true, @value="/">, #<ActionController::Routing::DynamicSegment:0xb77479b4 @is_optional=false, @key=:id, @regexp=/[^\/.?]+/>, #<ActionController::Routing::DividerSegment:0xb7747900 @is_optional=false, @raw=true, @value="/">, #<ActionController::Routing::StaticSegment:0xb7747860 @is_optional=false, @value="edit">, #<ActionController::Routing::OptionalFormatSegment:0xb77477e8 @is_optional=true, @key=:format>], @action_requirement="edit", @controller_requirement="orders", @defaults={:action=>"edit", :controller=>"orders"}, @matching_prepared=true, @significant_keys=[:id, :format, :action, :controller], @requirements={:action=>"edit", :controller=>"orders"}>, #<ActionController::Routing::Route:0xb774171c @to_s="GET /orders/:id(.:format)? {:action=>\"show\", :controller=>\"orders\"}", @optimise=false, @parameter_shell={:action=>"show", :controller=>"orders"}, @conditions={:method=>:get}, @segments=[#<ActionController::Routing::DividerSegment:0xb7741eb0 @is_optional=false, @raw=true, @value="/">, #<ActionController::Routing::StaticSegment:0xb7741e10 @is_optional=false, @value="orders">, #<ActionController::Routing::DividerSegment:0xb7741d5c @is_optional=false, @raw=true, @value="/">, #<ActionController::Routing::DynamicSegment:0xb7741cbc @is_optional=false, @key=:id, @regexp=/[^\/.?]+/>, #<ActionController::Routing::OptionalFormatSegment:0xb7741c44 @is_optional=true, @key=:format>], @action_requirement="show", @controller_requirement="orders", @defaults={:action=>"show", :controller=>"orders"}, @matching_prepared=true, @significant_keys=[:id, :format, :action, :controller], @requirements={:action=>"show", :controller=>"orders"}>, #<ActionController::Routing::Route:0xb773bc90 @to_s="PUT /orders/:id(.:format)? {:action=>\"update\", :controller=>\"orders\"}", @optimise=false, @parameter_shell={:action=>"update", :controller=>"orders"}, @conditions={:method=>:put}, @segments=[#<ActionController::Routing::DividerSegment:0xb773c424 @is_optional=false, @raw=true, @value="/">, #<ActionController::Routing::StaticSegment:0xb773c384 @is_optional=false, @value="orders">, #<ActionController::Routing::DividerSegment:0xb773c2d0 @is_optional=false, @raw=true, @value="/">, #<ActionController::Routing::DynamicSegment:0xb773c230 @is_optional=false, @key=:id, @regexp=/[^\/.?]+/>, #<ActionController::Routing::OptionalFormatSegment:0xb773c1b8 @is_optional=true, @key=:format>], @action_requirement="update", @controller_requirement="orders", @defaults={:action=>"update", :controller=>"orders"}, @matching_prepared=true, @significant_keys=[:id, :format, :action, :controller], @requirements={:action=>"update", :controller=>"orders"}>, #<ActionController::Routing::Route:0xb7738c34 @to_s="DELETE /orders/:id(.:format)? {:action=>\"destroy\", :controller=>\"orders\"}", @optimise=false, @parameter_shell={:action=>"destroy", :controller=>"orders"}, @conditions={:method=>:delete}, @segments=[#<ActionController::Routing::DividerSegment:0xb77393c8 @is_optional=false, @raw=true, @value="/">, #<ActionController::Routing::StaticSegment:0xb7739328 @is_optional=false, @value="orders">, #<ActionController::Routing::DividerSegment:0xb7739274 @is_optional=false, @raw=true, @value="/">, #<ActionController::Routing::DynamicSegment:0xb77391d4 @is_optional=false, @key=:id, @regexp=/[^\/.?]+/>, #<ActionController::Routing::OptionalFormatSegment:0xb773915c @is_optional=true, @key=:format>], @action_requirement="destroy", @controller_requirement="orders", @defaults={:action=>"destroy", :controller=>"orders"}, @matching_prepared=true, @significant_keys=[:id, :format, :action, :controller], @requirements={:action=>"destroy", :controller=>"orders"}>, #<ActionController::Routing::Route:0xb7735a70 @to_s="GET /products(.:format)? {:action=>\"index\", :controller=>\"products\"}", @optimise=true, @parameter_shell={:action=>"index", :controller=>"products"}, @conditions={:method=>:get}, @segments=[#<ActionController::Routing::DividerSegment:0xb7735f34 @is_optional=false, @raw=true, @value="/">, #<ActionController::Routing::StaticSegment:0xb7735e94 @is_optional=false, @value="products">, #<ActionController::Routing::OptionalFormatSegment:0xb7735e1c @is_optional=true, @key=:format>], @action_requirement="index", @controller_requirement="products", @defaults={:action=>"index", :controller=>"products"}, @matching_prepared=true, @significant_keys=[:format, :action, :controller], @requirements={:action=>"index", :controller=>"products"}>, #<ActionController::Routing::Route:0xb772ce0c @to_s="POST /products(.:format)? {:action=>\"create\", :controller=>\"products\"}", @optimise=true, @parameter_shell={:action=>"create", :controller=>"products"}, @conditions={:method=>:post}, @segments=[#<ActionController::Routing::DividerSegment:0xb772d2d0 @is_optional=false, @raw=true, @value="/">, #<ActionController::Routing::StaticSegment:0xb772d230 @is_optional=false, @value="products">, #<ActionController::Routing::OptionalFormatSegment:0xb772d1b8 @is_optional=true, @key=:format>], @action_requirement="create", @controller_requirement="products", @defaults={:action=>"create", :controller=>"products"}, @matching_prepared=true, @significant_keys=[:format, :action, :controller], @requirements={:action=>"create", :controller=>"products"}>, #<ActionController::Routing::Route:0xb772aa08 @to_s="GET /products/new(.:format)? {:action=>\"new\", :controller=>\"products\"}", @optimise=true, @parameter_shell={:action=>"new", :controller=>"products"}, @conditions={:method=>:get}, @segments=[#<ActionController::Routing::DividerSegment:0xb772b070 @is_optional=false, @raw=true, @value="/">, #<ActionController::Routing::StaticSegment:0xb772afd0 @is_optional=false, @value="products">, #<ActionController::Routing::DividerSegment:0xb772af1c @is_optional=false, @raw=true, @value="/">, #<ActionController::Routing::StaticSegment:0xb772ae7c @is_optional=false, @value="new">, #<ActionController::Routing::OptionalFormatSegment:0xb772ae04 @is_optional=true, @key=:format>], @action_requirement="new", @controller_requirement="products", @defaults={:action=>"new", :controller=>"products"}, @matching_prepared=true, @significant_keys=[:format, :action, :controller], @requirements={:action=>"new", :controller=>"products"}>, #<ActionController::Routing::Route:0xb772164c @to_s="GET /products/:id/edit(.:format)? {:action=>\"edit\", :controller=>\"products\"}", @optimise=false, @parameter_shell={:action=>"edit", :controller=>"products"}, @conditions={:method=>:get}, @segments=[#<ActionController::Routing::DividerSegment:0xb7721f84 @is_optional=false, @raw=true, @value="/">, #<ActionController::Routing::StaticSegment:0xb7721ee4 @is_optional=false, @value="products">, #<ActionController::Routing::DividerSegment:0xb7721e30 @is_optional=false, @raw=true, @value="/">, #<ActionController::Routing::DynamicSegment:0xb7721d90 @is_optional=false, @key=:id, @regexp=/[^\/.?]+/>, #<ActionController::Routing::DividerSegment:0xb7721cdc @is_optional=false, @raw=true, @value="/">, #<ActionController::Routing::StaticSegment:0xb7721c3c @is_optional=false, @value="edit">, #<ActionController::Routing::OptionalFormatSegment:0xb7721bc4 @is_optional=true, @key=:format>], @action_requirement="edit", @controller_requirement="products", @defaults={:action=>"edit", :controller=>"products"}, @matching_prepared=true, @significant_keys=[:id, :format, :action, :controller], @requirements={:action=>"edit", :controller=>"products"}>, #<ActionController::Routing::Route:0xb771baf8 @to_s="GET /products/:id(.:format)? {:action=>\"show\", :controller=>\"products\"}", @optimise=false, @parameter_shell={:action=>"show", :controller=>"products"}, @conditions={:method=>:get}, @segments=[#<ActionController::Routing::DividerSegment:0xb771c28c @is_optional=false, @raw=true, @value="/">, #<ActionController::Routing::StaticSegment:0xb771c1ec @is_optional=false, @value="products">, #<ActionController::Routing::DividerSegment:0xb771c138 @is_optional=false, @raw=true, @value="/">, #<ActionController::Routing::DynamicSegment:0xb771c098 @is_optional=false, @key=:id, @regexp=/[^\/.?]+/>, #<ActionController::Routing::OptionalFormatSegment:0xb771c020 @is_optional=true, @key=:format>], @action_requirement="show", @controller_requirement="products", @defaults={:action=>"show", :controller=>"products"}, @matching_prepared=true, @significant_keys=[:id, :format, :action, :controller], @requirements={:action=>"show", :controller=>"products"}>, #<ActionController::Routing::Route:0xb771606c @to_s="PUT /products/:id(.:format)? {:action=>\"update\", :controller=>\"products\"}", @optimise=false, @parameter_shell={:action=>"update", :controller=>"products"}, @conditions={:method=>:put}, @segments=[#<ActionController::Routing::DividerSegment:0xb7716800 @is_optional=false, @raw=true, @value="/">, #<ActionController::Routing::StaticSegment:0xb7716760 @is_optional=false, @value="products">, #<ActionController::Routing::DividerSegment:0xb77166ac @is_optional=false, @raw=true, @value="/">, #<ActionController::Routing::DynamicSegment:0xb771660c @is_optional=false, @key=:id, @regexp=/[^\/.?]+/>, #<ActionController::Routing::OptionalFormatSegment:0xb7716594 @is_optional=true, @key=:format>], @action_requirement="update", @controller_requirement="products", @defaults={:action=>"update", :controller=>"products"}, @matching_prepared=true, @significant_keys=[:id, :format, :action, :controller], @requirements={:action=>"update", :controller=>"products"}>, #<ActionController::Routing::Route:0xb7713010 @to_s="DELETE /products/:id(.:format)? {:action=>\"destroy\", :controller=>\"products\"}", @optimise=false, @parameter_shell={:action=>"destroy", :controller=>"products"}, @conditions={:method=>:delete}, @segments=[#<ActionController::Routing::DividerSegment:0xb77137a4 @is_optional=false, @raw=true, @value="/">, #<ActionController::Routing::StaticSegment:0xb7713704 @is_optional=false, @value="products">, #<ActionController::Routing::DividerSegment:0xb7713650 @is_optional=false, @raw=true, @value="/">, #<ActionController::Routing::DynamicSegment:0xb77135b0 @is_optional=false, @key=:id, @regexp=/[^\/.?]+/>, #<ActionController::Routing::OptionalFormatSegment:0xb7713538 @is_optional=true, @key=:format>], @action_requirement="destroy", @controller_requirement="products", @defaults={:action=>"destroy", :controller=>"products"}, @matching_prepared=true, @significant_keys=[:id, :format, :action, :controller], @requirements={:action=>"destroy", :controller=>"products"}>, #<ActionController::Routing::Route:0xb7710284 @to_s="ANY /:controller/:action/:id/ {}", @optimise=false, @parameter_shell={}, @conditions={}, @segments=[#<ActionController::Routing::DividerSegment:0xb77107fc @is_optional=false, @raw=true, @value="/">, #<ActionController::Routing::ControllerSegment:0xb771075c @is_optional=false, @key=:controller>, #<ActionController::Routing::DividerSegment:0xb77106a8 @is_optional=true, @raw=true, @value="/">, #<ActionController::Routing::DynamicSegment:0xb7710608 @is_optional=true, @key=:action, @default="index">, #<ActionController::Routing::DividerSegment:0xb7710554 @is_optional=true, @raw=true, @value="/">, #<ActionController::Routing::DynamicSegment:0xb77104b4 @is_optional=true, @key=:id>, #<ActionController::Routing::DividerSegment:0xb7710400 @is_optional=true, @raw=true, @value="/">], @action_requirement=nil, @controller_requirement=nil, @defaults={:action=>"index"}, @matching_prepared=true, @significant_keys=[:controller, :action, :id], @requirements={}>, #<ActionController::Routing::Route:0xb770cea4 @to_s="ANY /:controller/:action/:id(.:format)? {}", @optimise=false, @parameter_shell={}, @conditions={}, @segments=[#<ActionController::Routing::DividerSegment:0xb770d3f4 @is_optional=false, @raw=true, @value="/">, #<ActionController::Routing::ControllerSegment:0xb770d354 @is_optional=false, @key=:controller>, #<ActionController::Routing::DividerSegment:0xb770d2a0 @is_optional=true, @raw=true, @value="/">, #<ActionController::Routing::DynamicSegment:0xb770d200 @is_optional=true, @key=:action, @default="index">, #<ActionController::Routing::DividerSegment:0xb770d14c @is_optional=true, @raw=true, @value="/">, #<ActionController::Routing::DynamicSegment:0xb770d0ac @is_optional=true, @key=:id>, #<ActionController::Routing::OptionalFormatSegment:0xb770d034 @is_optional=true, @key=:format>], @action_requirement=nil, @controller_requirement=nil, @defaults={:action=>"index"}, @matching_prepared=true, @significant_keys=[:controller, :action, :id, :format], @requirements={}>], @configuration_files=[]>
>> app = ActionController::Integration::Session.new
=> #<ActionController::Integration::Session:0xb76f85e4 @accept="text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5", @response=nil, @https=false, @status=nil, @remote_addr="127.0.0.1", @host="www.example.com", @request=nil, @status_message=nil, @named_routes_configured=true, @path=nil, @controller=nil, @result=nil, @request_count=0, @application=#<ActionController::Dispatcher:0xb76ef408 @output=#<IO:0xb7cb3f74>, @app=#<Rack::Lock:0xb76e537c @lock=#<Mutex:0xb76e52dc>, @app=#<ActionController::Failsafe:0xb76e5444 @app=#<ActionController::RewindableInput:0xb76e550c @app=#<ActionController::ParamsParser:0xb76e55d4 @app=#<Rack::MethodOverride:0xb76e569c @app=#<Rack::Head:0xb76e582c @app=#<Proc:0xb76f6500@/usr/lib/ruby/gems/1.8/gems/actionpack-2.3.2/lib/action_controller/dispatcher.rb:82>>>>>>>>, @cookies={}, @headers=nil>
>> puts rs.routes
GET /users(.:format)? {:action=>"index", :controller=>"users"}
POST /users(.:format)? {:action=>"create", :controller=>"users"}
GET /users/new(.:format)? {:action=>"new", :controller=>"users"}
GET /users/:id/edit(.:format)? {:action=>"edit", :controller=>"users"}
GET /users/:id(.:format)? {:action=>"show", :controller=>"users"}
PUT /users/:id(.:format)? {:action=>"update", :controller=>"users"}
DELETE /users/:id(.:format)? {:action=>"destroy", :controller=>"users"}
GET /line_items(.:format)? {:action=>"index", :controller=>"line_items"}
POST /line_items(.:format)? {:action=>"create", :controller=>"line_items"}
GET /line_items/new(.:format)? {:action=>"new", :controller=>"line_items"}
GET /line_items/:id/edit(.:format)? {:action=>"edit", :controller=>"line_items"}
GET /line_items/:id(.:format)? {:action=>"show", :controller=>"line_items"}
PUT /line_items/:id(.:format)? {:action=>"update", :controller=>"line_items"}
DELETE /line_items/:id(.:format)? {:action=>"destroy", :controller=>"line_items"}
GET /orders(.:format)? {:action=>"index", :controller=>"orders"}
POST /orders(.:format)? {:action=>"create", :controller=>"orders"}
GET /orders/new(.:format)? {:action=>"new", :controller=>"orders"}
GET /orders/:id/edit(.:format)? {:action=>"edit", :controller=>"orders"}
GET /orders/:id(.:format)? {:action=>"show", :controller=>"orders"}
PUT /orders/:id(.:format)? {:action=>"update", :controller=>"orders"}
DELETE /orders/:id(.:format)? {:action=>"destroy", :controller=>"orders"}
GET /products(.:format)? {:action=>"index", :controller=>"products"}
POST /products(.:format)? {:action=>"create", :controller=>"products"}
GET /products/new(.:format)? {:action=>"new", :controller=>"products"}
GET /products/:id/edit(.:format)? {:action=>"edit", :controller=>"products"}
GET /products/:id(.:format)? {:action=>"show", :controller=>"products"}
PUT /products/:id(.:format)? {:action=>"update", :controller=>"products"}
DELETE /products/:id(.:format)? {:action=>"destroy", :controller=>"products"}
ANY /:controller/:action/:id/ {}
ANY /:controller/:action/:id(.:format)? {}
=> nil
>> rs.recognize_path "/store"
=> {:action=>"index", :controller=>"store"}
>> rs.recognize_path "/store/add_to_cart/1"
=> {:action=>"add_to_cart", :controller=>"store", :id=>"1"}
>> rs.recognize_path "/store/add_to_cart/1.xml"
=> {:action=>"add_to_cart", :controller=>"store", :format=>"xml", :id=>"1"}
>> rs.generate :controller => :store
=> "/store"
>> rs.generate :controller => :store, :id => 123
=> "/store/index/123"
>> rs.recognize_path "/coupon/show/1"
=> {:action=>"show", :controller=>"coupon", :id=>"1"}
>> load "config/routes.rb"
=> []
>> rs.recognize_path "/coupon/show/1"
=> {:action=>"show", :controller=>"coupon", :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:0xb77d2e88 @named_routes=#<ActionController::Routing::RouteSet::NamedRouteCollection:0xb77cbf0c @module=#<Module:0xb77cbc14>, @routes={}, @helpers=[]>, @routes=[], @configuration_files=[]>
>> app = ActionController::Integration::Session.new
=> #<ActionController::Integration::Session:0xb77c1ca0 @accept="text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5", @response=nil, @https=false, @status=nil, @remote_addr="127.0.0.1", @host="www.example.com", @request=nil, @status_message=nil, @named_routes_configured=true, @path=nil, @controller=nil, @result=nil, @request_count=0, @application=#<ActionController::Dispatcher:0xb77b13c8 @output=#<IO:0xb7cbff68>, @app=#<Rack::Lock:0xb7796794 @lock=#<Mutex:0xb77964b0>, @app=#<ActionController::Failsafe:0xb779699c @app=#<ActionController::RewindableInput:0xb7796ab4 @app=#<ActionController::ParamsParser:0xb7796bcc @app=#<Rack::MethodOverride:0xb7796ca8 @app=#<Rack::Head:0xb7796e74 @app=#<Proc:0xb77bee24@/usr/lib/ruby/gems/1.8/gems/actionpack-2.3.2/lib/action_controller/dispatcher.rb:82>>>>>>>>, @cookies={}, @headers=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"
=> {:action=>"index", :controller=>"blog"}
>> rs.recognize_path "/blog/show/123"
=> {:action=>"show", :controller=>"blog", :id=>"123"}
>> rs.recognize_path "/blog/2004"
=> {:action=>"show_date", :controller=>"blog", :year=>"2004"}
>> rs.recognize_path "/blog/2004/12"
=> {:action=>"show_date", :controller=>"blog", :month=>"12", :year=>"2004"}
>> rs.recognize_path "/blog/2004/12/25"
=> {:action=>"show_date", :controller=>"blog", :month=>"12", :year=>"2004", :day=>"25"}
>> rs.recognize_path "/blog/article/edit/123"
=> {:action=>"edit", :controller=>"article", :id=>"123"}
>> rs.recognize_path "/blog/article/show_stats"
=> {:action=>"show_stats", :controller=>"article"}
>> rs.recognize_path "/blog/wibble"
=> {:action=>"unknown_request", :controller=>"blog", :anything=>["blog", "wibble"]}
>> rs.recognize_path "/junk"
=> {:action=>"unknown_request", :controller=>"blog", :anything=>["junk"]}
>> last_request = rs.recognize_path "/blog/2006/07/28"
=> {:action=>"show_date", :controller=>"blog", :month=>"07", :year=>"2006", :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.erb' -> `app/views/pager/user_list.erb'
`/home/rubys/git/awdwr/data/code/e1/views/app/views/pager/user_list.html.erb' -> `app/views/pager/user_list.html.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/20090528172732_create_users.rb
restart
rake db:migrate
mv 20090528172732_create_users.rb 20080601000001_create_users.rb
(in /home/rubys/git/awdwr/work/view)
== CreateUsers: migrating ====================================================
-- create_table(:users)
-> 0.0016s
== CreateUsers: migrated (0.0017s) ===========================================
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/init.rb' -> `vendor/plugins/country_select/init.rb'
`/home/rubys/git/awdwr/plugins/country_select/install.rb' -> `vendor/plugins/country_select/install.rb'
`/home/rubys/git/awdwr/plugins/country_select/MIT-LICENSE' -> `vendor/plugins/country_select/MIT-LICENSE'
`/home/rubys/git/awdwr/plugins/country_select/uninstall.rb' -> `vendor/plugins/country_select/uninstall.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/20090528172743_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/20090528172743_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/20090528172745_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/20090528172745_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 20090528172743_create_products.rb 20080601000002_create_products.rb
mv 20090528172745_create_details.rb 20080601000003_create_details.rb
(in /home/rubys/git/awdwr/work/view)
== CreateProducts: migrating =================================================
-- create_table(:products)
-> 0.0022s
== CreateProducts: migrated (0.0023s) ========================================
== CreateDetails: migrating ==================================================
-- create_table(:details)
-> 0.0015s
== CreateDetails: migrated (0.0016s) =========================================
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/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/objects.xml.builder' -> `app/views/test/objects.xml.builder'
`/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/t.html.erb' -> `app/views/test/t.html.erb'
`/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/example.rdoc' -> `app/views/test/example.rdoc'
`/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/calculate.html.erb' -> `app/views/test/calculate.html.erb'
`/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/calc.html.erb' -> `app/views/test/calc.html.erb'
`/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/example1.reval' -> `app/views/test/example1.reval'
get /test/select
Andy Bert Chas Dave Eric Fred
Andy Bert Chas Dave Eric Fred
Eric Chas Andy Fred Dave 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_with_helper.html.erb' -> `app/views/builder/new_with_helper.html.erb'
`/home/rubys/git/awdwr/data/code/e1/views/app/views/builder/new.html.erb' -> `app/views/builder/new.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/20090528172748_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/20090528172748_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 20090528172748_create_pictures.rb 20080601000004_create_pictures.rb
(in /home/rubys/git/awdwr/work/view)
== CreatePictures: migrating =================================================
-- create_table(:pictures)
-> 0.0018s
== CreatePictures: migrated (0.0020s) ========================================
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/get.html.erb' -> `app/views/upload/get.html.erb'
`/home/rubys/git/awdwr/data/code/e1/views/app/views/upload/save.html.erb' -> `app/views/upload/save.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/test1.html.erb' -> `app/views/partial/test1.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/_partial.html.erb' -> `app/views/partial/_partial.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/_spacer.html.erb' -> `app/views/partial/_spacer.html.erb'
`/home/rubys/git/awdwr/data/code/e1/views/app/views/partial/_animal.html.erb' -> `app/views/partial/_animal.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/20090528172751_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/list.html.erb' -> `app/views/blog/list.html.erb'
`/home/rubys/git/awdwr/data/code/e1/views/app/views/blog/index.html.erb' -> `app/views/blog/index.html.erb'
get /blog/list
Thu May 28 13:27:51 -0400 2009
Thu May 28 13:27:51 -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
Thu May 28 13:27:51 -0400 2009
Thu May 28 13:27:51 -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 => Thu May 28 13:27:53 -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/004_populate_data.rb' -> `db/migrate/004_populate_data.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/002_create_line_items.rb' -> `db/migrate/002_create_line_items.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/fixtures/orders.yml' -> `./test/fixtures/orders.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/products.yml' -> `./test/fixtures/products.yml'
`/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/unit/order_mailer_test.rb' -> `./test/unit/order_mailer_test.rb'
`/home/rubys/git/awdwr/data/code/e1/mailer/test/functional/order_controller_test.rb' -> `./test/functional/order_controller_test.rb'
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/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'
`/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/sent.erb' -> `app/views/order_mailer/sent.erb'
`/home/rubys/git/awdwr/data/code/e1/mailer/app/views/order_mailer/_line_item.erb' -> `app/views/order_mailer/_line_item.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.0020s
== CreateProducts: migrated (0.0021s) ========================================
== CreateLineItems: migrating ================================================
-- create_table(:line_items)
-> 0.0015s
== CreateLineItems: migrated (0.0016s) =======================================
== CreateOrders: migrating ===================================================
-- create_table(:orders)
-> 0.0019s
== CreateOrders: migrated (0.0020s) ==========================================
== PopulateData: migrating ===================================================
== PopulateData: migrated (0.0371s) ==========================================
get /test/create_order
Date: Thu, 28 May 2009 13:27:57 -0400
From: orders@example.com
To: dave@example.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.06649 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.090369 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
<"=> \"Dave Thomas\""> expected but was
<" create ">.
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:1087
./checkdepot.rb:18:in `instance_eval'
./checkdepot.rb:18:in `test_26_Active_Resources'
/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'
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 Moved Temporarily => 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:0xb759a1d4 @attributes={"image_url"=>"/images/auto.jpg", "updated_at"=>Thu May 28 17:24:34 UTC 2009, "title"=>"Pragmatic Project Automation", "price"=>#<BigDecimal:b759b1b0,'0.2995E2',8(8)>, "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>", "created_at"=>Thu May 28 17:24:34 UTC 2009}, @prefix_options={}>
>> puts p.price
29.95
=> nil
>> p.price-=5
=> #<BigDecimal:b7592d1c,'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
=> "Joe User"
>> Order.find(1).line_items
NoMethodError: undefined method `line_items' for #<Order:0xb757c738>
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 Thu May 28 13:28:13 -0400 2009
We have 1 order.
get /orders/1/line_items.xml
<?xml version="1.0" encoding="UTF-8"?>
<nil-classes type="array"/>
echo "LineItem.find(:all, :params => {:order_id=>1})" |ruby script/console
>> LineItem.find(:all, :params => {:order_id=>1})
=> []
>>
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
=> nil
>> puts li.total_price
NoMethodError: You have a nil object when you didn't expect it!
The error occurred while evaluating nil.total_price
from (irb):2
>> li.total_price*=0.8
NoMethodError: You have a nil object when you didn't expect it!
The error occurred while evaluating nil.total_price
from (irb):3
>> li.save
NoMethodError: You have a nil object when you didn't expect it!
You might have expected an instance of ActiveRecord::Base.
The error occurred while evaluating nil.save
from (irb):4
>> li2 = LineItem.new(:order_id=>1, :product_id=>2, :quantity=>1, :total_price=>0.0)
=> #<LineItem:0xb760a5b0 @attributes={"total_price"=>0.0, "product_id"=>2, "quantity"=>1}, @prefix_options={:order_id=>1}>
>> li2.save
=> true
>>
restart