Your Pragmatic Cart
- 1 × Pragmatic Project Automation
8.4 Iteration C3: Handling Errors 8.2 Iteration C1: Creating a 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 %> × <%= item.title %></li>
<% end %>
</ul>
get /store/add_to_cart/2
undefined method `product' for #<Product:0x7f47e4aef938>
Rails.root: /home/rubys/git/awdwr/edition3/work-187-30/depot
app/models/cart.rb:10:in `add_product'
app/models/cart.rb:10:in `each'
app/models/cart.rb:10:in `find'
app/models/cart.rb:10:in `add_product'
app/controllers/store_controller.rb:11:in `add_to_cart'
/home/rubys/git/rails/activemodel/lib/active_model/attribute_methods.rb:392:in `method_missing'
/home/rubys/git/rails/activerecord/lib/active_record/attribute_methods.rb:46:in `method_missing'
/home/rubys/git/rails/activerecord/lib/active_record/attribute_methods.rb:44:in `send'
/home/rubys/git/rails/activerecord/lib/active_record/attribute_methods.rb:44:in `method_missing'
/home/rubys/git/rails/activemodel/lib/active_model/attribute_methods.rb:97:in `find'
/home/rubys/git/rails/actionpack/lib/action_controller/metal/implicit_render.rb:4:in `send_action'
/home/rubys/git/rails/actionpack/lib/action_controller/metal/implicit_render.rb:4:in `send_action'
/home/rubys/git/rails/actionpack/lib/abstract_controller/base.rb:150:in `process_action'
/home/rubys/git/rails/actionpack/lib/action_controller/metal/rendering.rb:11:in `process_action'
/home/rubys/git/rails/actionpack/lib/abstract_controller/callbacks.rb:18:in `process_action'
/home/rubys/git/rails/activesupport/lib/active_support/callbacks.rb:436:in `_run__904638583__process_action__1049483489__callbacks'
/home/rubys/git/rails/activesupport/lib/active_support/callbacks.rb:410:in `send'
/home/rubys/git/rails/activesupport/lib/active_support/callbacks.rb:410:in `_run_process_action_callbacks'
/home/rubys/git/rails/activesupport/lib/active_support/callbacks.rb:94:in `send'
/home/rubys/git/rails/activesupport/lib/active_support/callbacks.rb:94:in `run_callbacks'
/home/rubys/git/rails/actionpack/lib/abstract_controller/callbacks.rb:17:in `process_action'
/home/rubys/git/rails/actionpack/lib/action_controller/metal/rescue.rb:17:in `process_action'
/home/rubys/git/rails/actionpack/lib/action_controller/metal/instrumentation.rb:30:in `process_action'
/home/rubys/git/rails/activesupport/lib/active_support/notifications.rb:52:in `instrument'
/home/rubys/git/rails/activesupport/lib/active_support/notifications/instrumenter.rb:21:in `instrument'
/home/rubys/git/rails/activesupport/lib/active_support/notifications.rb:52:in `instrument'
/home/rubys/git/rails/actionpack/lib/action_controller/metal/instrumentation.rb:29:in `process_action'
/home/rubys/git/rails/actionpack/lib/abstract_controller/base.rb:119:in `process'
/home/rubys/git/rails/actionpack/lib/abstract_controller/rendering.rb:41:in `process'
/home/rubys/git/rails/actionpack/lib/action_controller/metal.rb:138:in `dispatch'
/home/rubys/git/rails/actionpack/lib/action_controller/metal/rack_delegation.rb:14:in `dispatch'
/home/rubys/git/rails/actionpack/lib/action_controller/metal.rb:178:in `action'
/home/rubys/git/rails/actionpack/lib/action_dispatch/routing/route_set.rb:68:in `call'
/home/rubys/git/rails/actionpack/lib/action_dispatch/routing/route_set.rb:68:in `dispatch'
/home/rubys/git/rails/actionpack/lib/action_dispatch/routing/route_set.rb:33:in `call'
rack-mount (0.6.14) lib/rack/mount/route_set.rb:148:in `call'
rack-mount (0.6.14) lib/rack/mount/code_generation.rb:93:in `recognize'
rack-mount (0.6.14) lib/rack/mount/code_generation.rb:75:in `optimized_each'
rack-mount (0.6.14) lib/rack/mount/code_generation.rb:92:in `recognize'
rack-mount (0.6.14) lib/rack/mount/route_set.rb:139:in `call'
/home/rubys/git/rails/actionpack/lib/action_dispatch/routing/route_set.rb:499:in `call'
/home/rubys/git/rails/actionpack/lib/action_dispatch/middleware/best_standards_support.rb:17:in `call'
/home/rubys/git/rails/actionpack/lib/action_dispatch/middleware/head.rb:14:in `call'
rack (1.2.5) lib/rack/methodoverride.rb:24:in `call'
/home/rubys/git/rails/actionpack/lib/action_dispatch/middleware/params_parser.rb:21:in `call'
/home/rubys/git/rails/actionpack/lib/action_dispatch/middleware/flash.rb:182:in `call'
/home/rubys/git/rails/actionpack/lib/action_dispatch/middleware/session/abstract_store.rb:149:in `call'
/home/rubys/git/rails/actionpack/lib/action_dispatch/middleware/cookies.rb:302:in `call'
/home/rubys/git/rails/activerecord/lib/active_record/query_cache.rb:32:in `call'
/home/rubys/git/rails/activerecord/lib/active_record/connection_adapters/abstract/query_cache.rb:28:in `cache'
/home/rubys/git/rails/activerecord/lib/active_record/query_cache.rb:12:in `cache'
/home/rubys/git/rails/activerecord/lib/active_record/query_cache.rb:31:in `call'
/home/rubys/git/rails/activerecord/lib/active_record/connection_adapters/abstract/connection_pool.rb:354:in `call'
/home/rubys/git/rails/actionpack/lib/action_dispatch/middleware/callbacks.rb:46:in `call'
/home/rubys/git/rails/activesupport/lib/active_support/callbacks.rb:416:in `_run_call_callbacks'
/home/rubys/git/rails/actionpack/lib/action_dispatch/middleware/callbacks.rb:44:in `call'
rack (1.2.5) lib/rack/sendfile.rb:106:in `call'
/home/rubys/git/rails/actionpack/lib/action_dispatch/middleware/remote_ip.rb:48:in `call'
/home/rubys/git/rails/actionpack/lib/action_dispatch/middleware/show_exceptions.rb:47:in `call'
/home/rubys/git/rails/railties/lib/rails/rack/logger.rb:13:in `call'
rack (1.2.5) lib/rack/runtime.rb:17:in `call'
/home/rubys/git/rails/activesupport/lib/active_support/cache/strategy/local_cache.rb:72:in `call'
rack (1.2.5) lib/rack/lock.rb:13:in `call'
rack (1.2.5) lib/rack/lock.rb:13:in `synchronize'
rack (1.2.5) lib/rack/lock.rb:13:in `call'
/home/rubys/git/rails/actionpack/lib/action_dispatch/middleware/static.rb:30:in `call'
/home/rubys/git/rails/railties/lib/rails/application.rb:168:in `call'
/home/rubys/git/rails/railties/lib/rails/application.rb:77:in `send'
/home/rubys/git/rails/railties/lib/rails/application.rb:77:in `method_missing'
/home/rubys/git/rails/railties/lib/rails/rack/log_tailer.rb:14:in `call'
rack (1.2.5) lib/rack/content_length.rb:13:in `call'
rack (1.2.5) lib/rack/handler/webrick.rb:52:in `service'
/home/rubys/.rvm/rubies/ruby-1.8.7-p371/lib/ruby/1.8/webrick/httpserver.rb:104:in `service'
/home/rubys/.rvm/rubies/ruby-1.8.7-p371/lib/ruby/1.8/webrick/httpserver.rb:65:in `run'
/home/rubys/.rvm/rubies/ruby-1.8.7-p371/lib/ruby/1.8/webrick/server.rb:173:in `start_thread'
/home/rubys/.rvm/rubies/ruby-1.8.7-p371/lib/ruby/1.8/webrick/server.rb:162:in `start'
/home/rubys/.rvm/rubies/ruby-1.8.7-p371/lib/ruby/1.8/webrick/server.rb:162:in `start_thread'
/home/rubys/.rvm/rubies/ruby-1.8.7-p371/lib/ruby/1.8/webrick/server.rb:95:in `start'
/home/rubys/.rvm/rubies/ruby-1.8.7-p371/lib/ruby/1.8/webrick/server.rb:92:in `each'
/home/rubys/.rvm/rubies/ruby-1.8.7-p371/lib/ruby/1.8/webrick/server.rb:92:in `start'
/home/rubys/.rvm/rubies/ruby-1.8.7-p371/lib/ruby/1.8/webrick/server.rb:23:in `start'
/home/rubys/.rvm/rubies/ruby-1.8.7-p371/lib/ruby/1.8/webrick/server.rb:82:in `start'
rack (1.2.5) lib/rack/handler/webrick.rb:13:in `run'
rack (1.2.5) lib/rack/server.rb:217:in `start'
/home/rubys/git/rails/railties/lib/rails/commands/server.rb:65:in `start'
/home/rubys/git/rails/railties/lib/rails/commands.rb:30
/home/rubys/git/rails/railties/lib/rails/commands.rb:27:in `tap'
/home/rubys/git/rails/railties/lib/rails/commands.rb:27
script/rails:6:in `require'
script/rails:6
/home/rubys/git/rails/activemodel/lib/active_model/attribute_methods.rb:392:in `method_missing'
/home/rubys/git/rails/activerecord/lib/active_record/attribute_methods.rb:46:in `method_missing'
/home/rubys/git/rails/activerecord/lib/active_record/attribute_methods.rb:44:in `send'
/home/rubys/git/rails/activerecord/lib/active_record/attribute_methods.rb:44:in `method_missing'
app/models/cart.rb:10:in `add_product'
/home/rubys/git/rails/activemodel/lib/active_model/attribute_methods.rb:97:in `find'
app/models/cart.rb:10:in `each'
app/models/cart.rb:10:in `find'
app/models/cart.rb:10:in `add_product'
app/controllers/store_controller.rb:11:in `add_to_cart'
/home/rubys/git/rails/actionpack/lib/action_controller/metal/implicit_render.rb:4:in `send_action'
/home/rubys/git/rails/actionpack/lib/action_controller/metal/implicit_render.rb:4:in `send_action'
/home/rubys/git/rails/actionpack/lib/abstract_controller/base.rb:150:in `process_action'
/home/rubys/git/rails/actionpack/lib/action_controller/metal/rendering.rb:11:in `process_action'
/home/rubys/git/rails/actionpack/lib/abstract_controller/callbacks.rb:18:in `process_action'
/home/rubys/git/rails/activesupport/lib/active_support/callbacks.rb:436:in `_run__904638583__process_action__1049483489__callbacks'
/home/rubys/git/rails/activesupport/lib/active_support/callbacks.rb:410:in `send'
/home/rubys/git/rails/activesupport/lib/active_support/callbacks.rb:410:in `_run_process_action_callbacks'
/home/rubys/git/rails/activesupport/lib/active_support/callbacks.rb:94:in `send'
/home/rubys/git/rails/activesupport/lib/active_support/callbacks.rb:94:in `run_callbacks'
/home/rubys/git/rails/actionpack/lib/abstract_controller/callbacks.rb:17:in `process_action'
/home/rubys/git/rails/actionpack/lib/action_controller/metal/rescue.rb:17:in `process_action'
/home/rubys/git/rails/actionpack/lib/action_controller/metal/instrumentation.rb:30:in `process_action'
/home/rubys/git/rails/activesupport/lib/active_support/notifications.rb:52:in `instrument'
/home/rubys/git/rails/activesupport/lib/active_support/notifications/instrumenter.rb:21:in `instrument'
/home/rubys/git/rails/activesupport/lib/active_support/notifications.rb:52:in `instrument'
/home/rubys/git/rails/actionpack/lib/action_controller/metal/instrumentation.rb:29:in `process_action'
/home/rubys/git/rails/actionpack/lib/abstract_controller/base.rb:119:in `process'
/home/rubys/git/rails/actionpack/lib/abstract_controller/rendering.rb:41:in `process'
/home/rubys/git/rails/actionpack/lib/action_controller/metal.rb:138:in `dispatch'
/home/rubys/git/rails/actionpack/lib/action_controller/metal/rack_delegation.rb:14:in `dispatch'
/home/rubys/git/rails/actionpack/lib/action_controller/metal.rb:178:in `action'
/home/rubys/git/rails/actionpack/lib/action_dispatch/routing/route_set.rb:68:in `call'
/home/rubys/git/rails/actionpack/lib/action_dispatch/routing/route_set.rb:68:in `dispatch'
/home/rubys/git/rails/actionpack/lib/action_dispatch/routing/route_set.rb:33:in `call'
rack-mount (0.6.14) lib/rack/mount/route_set.rb:148:in `call'
rack-mount (0.6.14) lib/rack/mount/code_generation.rb:93:in `recognize'
rack-mount (0.6.14) lib/rack/mount/code_generation.rb:75:in `optimized_each'
rack-mount (0.6.14) lib/rack/mount/code_generation.rb:92:in `recognize'
rack-mount (0.6.14) lib/rack/mount/route_set.rb:139:in `call'
/home/rubys/git/rails/actionpack/lib/action_dispatch/routing/route_set.rb:499:in `call'
/home/rubys/git/rails/actionpack/lib/action_dispatch/middleware/best_standards_support.rb:17:in `call'
/home/rubys/git/rails/actionpack/lib/action_dispatch/middleware/head.rb:14:in `call'
rack (1.2.5) lib/rack/methodoverride.rb:24:in `call'
/home/rubys/git/rails/actionpack/lib/action_dispatch/middleware/params_parser.rb:21:in `call'
/home/rubys/git/rails/actionpack/lib/action_dispatch/middleware/flash.rb:182:in `call'
/home/rubys/git/rails/actionpack/lib/action_dispatch/middleware/session/abstract_store.rb:149:in `call'
/home/rubys/git/rails/actionpack/lib/action_dispatch/middleware/cookies.rb:302:in `call'
/home/rubys/git/rails/activerecord/lib/active_record/query_cache.rb:32:in `call'
/home/rubys/git/rails/activerecord/lib/active_record/connection_adapters/abstract/query_cache.rb:28:in `cache'
/home/rubys/git/rails/activerecord/lib/active_record/query_cache.rb:12:in `cache'
/home/rubys/git/rails/activerecord/lib/active_record/query_cache.rb:31:in `call'
/home/rubys/git/rails/activerecord/lib/active_record/connection_adapters/abstract/connection_pool.rb:354:in `call'
/home/rubys/git/rails/actionpack/lib/action_dispatch/middleware/callbacks.rb:46:in `call'
/home/rubys/git/rails/activesupport/lib/active_support/callbacks.rb:416:in `_run_call_callbacks'
/home/rubys/git/rails/actionpack/lib/action_dispatch/middleware/callbacks.rb:44:in `call'
rack (1.2.5) lib/rack/sendfile.rb:106:in `call'
/home/rubys/git/rails/actionpack/lib/action_dispatch/middleware/remote_ip.rb:48:in `call'
/home/rubys/git/rails/actionpack/lib/action_dispatch/middleware/show_exceptions.rb:47:in `call'
/home/rubys/git/rails/railties/lib/rails/rack/logger.rb:13:in `call'
rack (1.2.5) lib/rack/runtime.rb:17:in `call'
/home/rubys/git/rails/activesupport/lib/active_support/cache/strategy/local_cache.rb:72:in `call'
rack (1.2.5) lib/rack/lock.rb:13:in `call'
rack (1.2.5) lib/rack/lock.rb:13:in `synchronize'
rack (1.2.5) lib/rack/lock.rb:13:in `call'
/home/rubys/git/rails/actionpack/lib/action_dispatch/middleware/static.rb:30:in `call'
/home/rubys/git/rails/railties/lib/rails/application.rb:168:in `call'
/home/rubys/git/rails/railties/lib/rails/application.rb:77:in `send'
/home/rubys/git/rails/railties/lib/rails/application.rb:77:in `method_missing'
/home/rubys/git/rails/railties/lib/rails/rack/log_tailer.rb:14:in `call'
rack (1.2.5) lib/rack/content_length.rb:13:in `call'
rack (1.2.5) lib/rack/handler/webrick.rb:52:in `service'
/home/rubys/.rvm/rubies/ruby-1.8.7-p371/lib/ruby/1.8/webrick/httpserver.rb:104:in `service'
/home/rubys/.rvm/rubies/ruby-1.8.7-p371/lib/ruby/1.8/webrick/httpserver.rb:65:in `run'
/home/rubys/.rvm/rubies/ruby-1.8.7-p371/lib/ruby/1.8/webrick/server.rb:173:in `start_thread'
/home/rubys/.rvm/rubies/ruby-1.8.7-p371/lib/ruby/1.8/webrick/server.rb:162:in `start'
/home/rubys/.rvm/rubies/ruby-1.8.7-p371/lib/ruby/1.8/webrick/server.rb:162:in `start_thread'
/home/rubys/.rvm/rubies/ruby-1.8.7-p371/lib/ruby/1.8/webrick/server.rb:95:in `start'
/home/rubys/.rvm/rubies/ruby-1.8.7-p371/lib/ruby/1.8/webrick/server.rb:92:in `each'
/home/rubys/.rvm/rubies/ruby-1.8.7-p371/lib/ruby/1.8/webrick/server.rb:92:in `start'
/home/rubys/.rvm/rubies/ruby-1.8.7-p371/lib/ruby/1.8/webrick/server.rb:23:in `start'
/home/rubys/.rvm/rubies/ruby-1.8.7-p371/lib/ruby/1.8/webrick/server.rb:82:in `start'
rack (1.2.5) lib/rack/handler/webrick.rb:13:in `run'
rack (1.2.5) lib/rack/server.rb:217:in `start'
/home/rubys/git/rails/railties/lib/rails/commands/server.rb:65:in `start'
/home/rubys/git/rails/railties/lib/rails/commands.rb:30
/home/rubys/git/rails/railties/lib/rails/commands.rb:27:in `tap'
/home/rubys/git/rails/railties/lib/rails/commands.rb:27
script/rails:6:in `require'
script/rails:6
Parameters:
{"id"=>"2"}
cart: #<Cart:0x7f47e4aefa00 @items=[#<Product id: 2, title: "Pragmatic Project Automation", description: "<p>\n <em>Pragmatic Project Automation</em> sh...", image_url: "/images/auto.jpg", created_at: "2012-12-16 14:12:23", updated_at: "2012-12-16 14:12:23", price: #<BigDecimal:7f47e4993850,'0.2995E2',18(18)>>, #<Product id: 3, title: "Pragmatic Version Control", description: "<p>\n This book is a recipe-based approach t...", image_url: "/images/svn.jpg", created_at: "2012-12-16 14:12:23", updated_at: "2012-12-16 14:12:23", price: #<BigDecimal:7f47e4992928,'0.285E2',18(18)>>]>
GATEWAY_INTERFACE: "CGI/1.1" HTTP_ACCEPT: "text/html" HTTP_COOKIE: "_session_id=6c50900ddd59c8600e990c2893f9c043; path=/; HttpOnly" HTTP_HOST: "localhost:3000" HTTP_VERSION: "HTTP/1.1" PATH_INFO: "/store/add_to_cart/2" QUERY_STRING: "" REMOTE_ADDR: "192.168.1.100" REMOTE_HOST: "rubix.local" REQUEST_METHOD: "GET" REQUEST_PATH: "/" REQUEST_URI: "http://localhost:3000/store/add_to_cart/2" SCRIPT_NAME: "" SERVER_NAME: "localhost" SERVER_PORT: "3000" SERVER_PROTOCOL: "HTTP/1.1" SERVER_SOFTWARE: "WEBrick/1.3.1 (Ruby/1.8.7/2012-10-12)" action_controller.instance: #<StoreController:0x7f47e4a9e970 @_params={"controller"=>"store", "id"=>"2", "action"=>"add_to_cart"}, @_config=#<OrderedHash {}>, @_response=#<ActionDispatch::Response:0x7f47e4a9e6a0 @etag=nil, @status=200, @writer=#<Proc:0x00007f47e645f148@/home/rubys/git/rails/actionpack/lib/action_dispatch/http/response.rb:43>, @blank=false, @sending_file=false, @cache_control={}, @cookie=[], @body=[], @header={}, @request=#<ActionDispatch::Request:0x7f47e4a9e880 @fullpath="/store/add_to_cart/2", @env={"rack.session.record"=>#<ActiveRecord::SessionStore::Session id: 1, session_id: "6c50900ddd59c8600e990c2893f9c043", data: "BAh7BiIJY2FydG86CUNhcnQGOgtAaXRlbXNbB286DFByb2R1Y3Q...", created_at: "2012-12-16 14:12:49", updated_at: "2012-12-16 14:12:50">, "action_dispatch.parameter_filter"=>[:password], "REMOTE_HOST"=>"rubix.local", "action_dispatch.remote_ip"=>#<ActionDispatch::RemoteIp::RemoteIpGetter:0x7f47e4b33e08 @env={...}, @trusted_proxies=/(^127\.0\.0\.1$|^(10|172\.(1[6-9]|2[0-9]|30|31)|192\.168)\.)/i, @check_ip_spoofing=true>, "REQUEST_PATH"=>"/", "SERVER_SOFTWARE"=>"WEBrick/1.3.1 (Ruby/1.8.7/2012-10-12)", "action_controller.instance"=>#<StoreController:0x7f47e4a9e970 ...>, "rack.errors"=>#<IO:0x7f47ea5ecac0>, "rack.multithread"=>false, "HTTP_HOST"=>"localhost:3000", "action_dispatch.request.formats"=>[#<Mime::Type:0x7f47e79aca78 @synonyms=["application/xhtml+xml"], @string="text/html", @symbol=:html>], "action_dispatch.request.accepts"=>[#<Mime::Type:0x7f47e79aca78 @synonyms=["application/xhtml+xml"], @string="text/html", @symbol=:html>], "action_dispatch.request.content_type"=>nil, "action_dispatch.show_exceptions"=>true, "HTTP_VERSION"=>"HTTP/1.1", "rack.request.cookie_hash"=>{"HttpOnly"=>nil, "path"=>"/", "_session_id"=>"6c50900ddd59c8600e990c2893f9c043"}, "rack.request.cookie_string"=>"_session_id=6c50900ddd59c8600e990c2893f9c043; path=/; HttpOnly", "rack.url_scheme"=>"http", "SERVER_PROTOCOL"=>"HTTP/1.1", "SERVER_NAME"=>"localhost", "action_dispatch.request.parameters"=>{"controller"=>"store", "id"=>"2", "action"=>"add_to_cart"}, "rack.session.options"=>{:expire_after=>nil, :httponly=>true, :secure=>false, :domain=>nil, :id=>"6c50900ddd59c8600e990c2893f9c043", :path=>"/"}, "rack.multiprocess"=>false, "SERVER_PORT"=>"3000", "rack.request.query_hash"=>{}, "rack.input"=>#<StringIO:0x7f47e4b35550>, "HTTP_COOKIE"=>"_session_id=6c50900ddd59c8600e990c2893f9c043; path=/; HttpOnly", "rack.version"=>[1, 1], "HTTP_ACCEPT"=>"text/html", "QUERY_STRING"=>"", "PATH_INFO"=>"/store/add_to_cart/2", "action_dispatch.request.query_parameters"=>{}, "action_dispatch.request.request_parameters"=>{}, "action_dispatch.request.path_parameters"=>{:controller=>"store", :action=>"add_to_cart", :id=>"2"}, "REQUEST_URI"=>"http://localhost:3000/store/add_to_cart/2", "rack.request.query_string"=>"", "rack.session"=>{"cart"=>#<Cart:0x7f47e4aefa00 @items=[#<Product id: 2, title: "Pragmatic Project Automation", description: "<p>\n <em>Pragmatic Project Automation</em> sh...", image_url: "/images/auto.jpg", created_at: "2012-12-16 14:12:23", updated_at: "2012-12-16 14:12:23", price: #<BigDecimal:7f47e498d950,'0.2995E2',18(18)>>, #<Product id: 3, title: "Pragmatic Version Control", description: "<p>\n This book is a recipe-based approach t...", image_url: "/images/svn.jpg", created_at: "2012-12-16 14:12:23", updated_at: "2012-12-16 14:12:23", price: #<BigDecimal:7f47e498cfa0,'0.285E2',18(18)>>]>}, "action_dispatch.secret_token"=>"358ebe998fa7e1b358d68338f154d0e76dc5b76492b864e18679666f986461cef38328e3177aa10fb0611b3554cabe97f80baa7dac807a99798e688b91834655", "rack.run_once"=>false, "SCRIPT_NAME"=>"", "REQUEST_METHOD"=>"GET", "REMOTE_ADDR"=>"192.168.1.100", "GATEWAY_INTERFACE"=>"CGI/1.1"}, @method="GET", @filtered_parameters={"controller"=>"store", "id"=>"2", "action"=>"add_to_cart"}, @request_method="GET">, @length=0, @block=nil>, @_status=200, @cart=#<Cart:0x7f47e4aefa00 @items=[#<Product id: 2, title: "Pragmatic Project Automation", description: "<p>\n <em>Pragmatic Project Automation</em> sh...", image_url: "/images/auto.jpg", created_at: "2012-12-16 14:12:23", updated_at: "2012-12-16 14:12:23", price: #<BigDecimal:7f47e498c280,'0.2995E2',18(18)>>, #<Product id: 3, title: "Pragmatic Version Control", description: "<p>\n This book is a recipe-based approach t...", image_url: "/images/svn.jpg", created_at: "2012-12-16 14:12:23", updated_at: "2012-12-16 14:12:23", price: #<BigDecimal:7f47e498b948,'0.285E2',18(18)>>]>, @_response_body=nil, @_request=#<ActionDispatch::Request:0x7f47e4a9e880 @fullpath="/store/add_to_cart/2", @env={"rack.session.record"=>#<ActiveRecord::SessionStore::Session id: 1, session_id: "6c50900ddd59c8600e990c2893f9c043", data: "BAh7BiIJY2FydG86CUNhcnQGOgtAaXRlbXNbB286DFByb2R1Y3Q...", created_at: "2012-12-16 14:12:49", updated_at: "2012-12-16 14:12:50">, "action_dispatch.parameter_filter"=>[:password], "REMOTE_HOST"=>"rubix.local", "action_dispatch.remote_ip"=>#<ActionDispatch::RemoteIp::RemoteIpGetter:0x7f47e4b33e08 @env={...}, @trusted_proxies=/(^127\.0\.0\.1$|^(10|172\.(1[6-9]|2[0-9]|30|31)|192\.168)\.)/i, @check_ip_spoofing=true>, "REQUEST_PATH"=>"/", "SERVER_SOFTWARE"=>"WEBrick/1.3.1 (Ruby/1.8.7/2012-10-12)", "action_controller.instance"=>#<StoreController:0x7f47e4a9e970 ...>, "rack.errors"=>#<IO:0x7f47ea5ecac0>, "rack.multithread"=>false, "HTTP_HOST"=>"localhost:3000", "action_dispatch.request.formats"=>[#<Mime::Type:0x7f47e79aca78 @synonyms=["application/xhtml+xml"], @string="text/html", @symbol=:html>], "action_dispatch.request.accepts"=>[#<Mime::Type:0x7f47e79aca78 @synonyms=["application/xhtml+xml"], @string="text/html", @symbol=:html>], "action_dispatch.request.content_type"=>nil, "action_dispatch.show_exceptions"=>true, "HTTP_VERSION"=>"HTTP/1.1", "rack.request.cookie_hash"=>{"HttpOnly"=>nil, "path"=>"/", "_session_id"=>"6c50900ddd59c8600e990c2893f9c043"}, "rack.request.cookie_string"=>"_session_id=6c50900ddd59c8600e990c2893f9c043; path=/; HttpOnly", "rack.url_scheme"=>"http", "SERVER_PROTOCOL"=>"HTTP/1.1", "SERVER_NAME"=>"localhost", "action_dispatch.request.parameters"=>{"controller"=>"store", "id"=>"2", "action"=>"add_to_cart"}, "rack.session.options"=>{:expire_after=>nil, :httponly=>true, :secure=>false, :domain=>nil, :id=>"6c50900ddd59c8600e990c2893f9c043", :path=>"/"}, "rack.multiprocess"=>false, "SERVER_PORT"=>"3000", "rack.request.query_hash"=>{}, "rack.input"=>#<StringIO:0x7f47e4b35550>, "HTTP_COOKIE"=>"_session_id=6c50900ddd59c8600e990c2893f9c043; path=/; HttpOnly", "rack.version"=>[1, 1], "HTTP_ACCEPT"=>"text/html", "QUERY_STRING"=>"", "PATH_INFO"=>"/store/add_to_cart/2", "action_dispatch.request.query_parameters"=>{}, "action_dispatch.request.request_parameters"=>{}, "action_dispatch.request.path_parameters"=>{:controller=>"store", :action=>"add_to_cart", :id=>"2"}, "REQUEST_URI"=>"http://localhost:3000/store/add_to_cart/2", "rack.request.query_string"=>"", "rack.session"=>{"cart"=>#<Cart:0x7f47e4aefa00 @items=[#<Product id: 2, title: "Pragmatic Project Automation", description: "<p>\n <em>Pragmatic Project Automation</em> sh...", image_url: "/images/auto.jpg", created_at: "2012-12-16 14:12:23", updated_at: "2012-12-16 14:12:23", price: #<BigDecimal:7f47e49894b8,'0.2995E2',18(18)>>, #<Product id: 3, title: "Pragmatic Version Control", description: "<p>\n This book is a recipe-based approach t...", image_url: "/images/svn.jpg", created_at: "2012-12-16 14:12:23", updated_at: "2012-12-16 14:12:23", price: #<BigDecimal:7f47e4988b80,'0.285E2',18(18)>>]>}, "action_dispatch.secret_token"=>"358ebe998fa7e1b358d68338f154d0e76dc5b76492b864e18679666f986461cef38328e3177aa10fb0611b3554cabe97f80baa7dac807a99798e688b91834655", "rack.run_once"=>false, "SCRIPT_NAME"=>"", "REQUEST_METHOD"=>"GET", "REMOTE_ADDR"=>"192.168.1.100", "GATEWAY_INTERFACE"=>"CGI/1.1"}, @method="GET", @filtered_parameters={"controller"=>"store", "id"=>"2", "action"=>"add_to_cart"}, @request_method="GET">, @lookup_context=#<ActionView::LookupContext:0x7f47e4a9dc00 @view_paths=[#<ActionView::FileSystemResolver:0x7f47e4c8fe00 @caching=false, @path="/home/rubys/git/awdwr/edition3/work-187-30/depot/app/views", @cached={}>], @details_key=nil, @skip_default_locale=false, @details={:formats=>[:html], :locale=>[:en, :en], :handlers=>[:erb, :rjs, :builder, :rhtml, :rxml]}, @frozen_formats=false>, @_env={"rack.session.record"=>#<ActiveRecord::SessionStore::Session id: 1, session_id: "6c50900ddd59c8600e990c2893f9c043", data: "BAh7BiIJY2FydG86CUNhcnQGOgtAaXRlbXNbB286DFByb2R1Y3Q...", created_at: "2012-12-16 14:12:49", updated_at: "2012-12-16 14:12:50">, "action_dispatch.parameter_filter"=>[:password], "REMOTE_HOST"=>"rubix.local", "action_dispatch.remote_ip"=>#<ActionDispatch::RemoteIp::RemoteIpGetter:0x7f47e4b33e08 @env={...}, @trusted_proxies=/(^127\.0\.0\.1$|^(10|172\.(1[6-9]|2[0-9]|30|31)|192\.168)\.)/i, @check_ip_spoofing=true>, "REQUEST_PATH"=>"/", "SERVER_SOFTWARE"=>"WEBrick/1.3.1 (Ruby/1.8.7/2012-10-12)", "action_controller.instance"=>#<StoreController:0x7f47e4a9e970 ...>, "rack.errors"=>#<IO:0x7f47ea5ecac0>, "rack.multithread"=>false, "HTTP_HOST"=>"localhost:3000", "action_dispatch.request.formats"=>[#<Mime::Type:0x7f47e79aca78 @synonyms=["application/xhtml+xml"], @string="text/html", @symbol=:html>], "action_dispatch.request.accepts"=>[#<Mime::Type:0x7f47e79aca78 @synonyms=["application/xhtml+xml"], @string="text/html", @symbol=:html>], "action_dispatch.request.content_type"=>nil, "action_dispatch.show_exceptions"=>true, "HTTP_VERSION"=>"HTTP/1.1", "rack.request.cookie_hash"=>{"HttpOnly"=>nil, "path"=>"/", "_session_id"=>"6c50900ddd59c8600e990c2893f9c043"}, "rack.request.cookie_string"=>"_session_id=6c50900ddd59c8600e990c2893f9c043; path=/; HttpOnly", "rack.url_scheme"=>"http", "SERVER_PROTOCOL"=>"HTTP/1.1", "SERVER_NAME"=>"localhost", "action_dispatch.request.parameters"=>{"controller"=>"store", "id"=>"2", "action"=>"add_to_cart"}, "rack.session.options"=>{:expire_after=>nil, :httponly=>true, :secure=>false, :domain=>nil, :id=>"6c50900ddd59c8600e990c2893f9c043", :path=>"/"}, "rack.multiprocess"=>false, "SERVER_PORT"=>"3000", "rack.request.query_hash"=>{}, "rack.input"=>#<StringIO:0x7f47e4b35550>, "HTTP_COOKIE"=>"_session_id=6c50900ddd59c8600e990c2893f9c043; path=/; HttpOnly", "rack.version"=>[1, 1], "HTTP_ACCEPT"=>"text/html", "QUERY_STRING"=>"", "PATH_INFO"=>"/store/add_to_cart/2", "action_dispatch.request.query_parameters"=>{}, "action_dispatch.request.request_parameters"=>{}, "action_dispatch.request.path_parameters"=>{:controller=>"store", :action=>"add_to_cart", :id=>"2"}, "REQUEST_URI"=>"http://localhost:3000/store/add_to_cart/2", "rack.request.query_string"=>"", "rack.session"=>{"cart"=>#<Cart:0x7f47e4aefa00 @items=[#<Product id: 2, title: "Pragmatic Project Automation", description: "<p>\n <em>Pragmatic Project Automation</em> sh...", image_url: "/images/auto.jpg", created_at: "2012-12-16 14:12:23", updated_at: "2012-12-16 14:12:23", price: #<BigDecimal:7f47e4986088,'0.2995E2',18(18)>>, #<Product id: 3, title: "Pragmatic Version Control", description: "<p>\n This book is a recipe-based approach t...", image_url: "/images/svn.jpg", created_at: "2012-12-16 14:12:23", updated_at: "2012-12-16 14:12:23", price: #<BigDecimal:7f47e4985750,'0.285E2',18(18)>>]>}, "action_dispatch.secret_token"=>"358ebe998fa7e1b358d68338f154d0e76dc5b76492b864e18679666f986461cef38328e3177aa10fb0611b3554cabe97f80baa7dac807a99798e688b91834655", "rack.run_once"=>false, "SCRIPT_NAME"=>"", "REQUEST_METHOD"=>"GET", "REMOTE_ADDR"=>"192.168.1.100", "GATEWAY_INTERFACE"=>"CGI/1.1"}, @_headers={"Content-Type"=>"text/html"}, @view_context_class=nil, @action_has_layout=true, @_action_name="add_to_cart"> action_dispatch.parameter_filter: [:password] action_dispatch.remote_ip: #<ActionDispatch::RemoteIp::RemoteIpGetter:0x7f47e4b33e08 @env={"rack.session.record"=>#<ActiveRecord::SessionStore::Session id: 1, session_id: "6c50900ddd59c8600e990c2893f9c043", data: "BAh7BiIJY2FydG86CUNhcnQGOgtAaXRlbXNbB286DFByb2R1Y3Q...", created_at: "2012-12-16 14:12:49", updated_at: "2012-12-16 14:12:50">, "action_dispatch.parameter_filter"=>[:password], "REMOTE_HOST"=>"rubix.local", "action_dispatch.remote_ip"=>#<ActionDispatch::RemoteIp::RemoteIpGetter:0x7f47e4b33e08 ...>, "REQUEST_PATH"=>"/", "SERVER_SOFTWARE"=>"WEBrick/1.3.1 (Ruby/1.8.7/2012-10-12)", "action_controller.instance"=>#<StoreController:0x7f47e4a9e970 @_params={"controller"=>"store", "id"=>"2", "action"=>"add_to_cart"}, @_config=#<OrderedHash {}>, @_response=#<ActionDispatch::Response:0x7f47e4a9e6a0 @etag=nil, @status=200, @writer=#<Proc:0x00007f47e645f148@/home/rubys/git/rails/actionpack/lib/action_dispatch/http/response.rb:43>, @blank=false, @sending_file=false, @cache_control={}, @cookie=[], @body=[], @header={}, @request=#<ActionDispatch::Request:0x7f47e4a9e880 @fullpath="/store/add_to_cart/2", @env={...}, @method="GET", @filtered_parameters={"controller"=>"store", "id"=>"2", "action"=>"add_to_cart"}, @request_method="GET">, @length=0, @block=nil>, @_status=200, @cart=#<Cart:0x7f47e4aefa00 @items=[#<Product id: 2, title: "Pragmatic Project Automation", description: "<p>\n <em>Pragmatic Project Automation</em> sh...", image_url: "/images/auto.jpg", created_at: "2012-12-16 14:12:23", updated_at: "2012-12-16 14:12:23", price: #<BigDecimal:7f47e4983b30,'0.2995E2',18(18)>>, #<Product id: 3, title: "Pragmatic Version Control", description: "<p>\n This book is a recipe-based approach t...", image_url: "/images/svn.jpg", created_at: "2012-12-16 14:12:23", updated_at: "2012-12-16 14:12:23", price: #<BigDecimal:7f47e49831f8,'0.285E2',18(18)>>]>, @_response_body=nil, @_request=#<ActionDispatch::Request:0x7f47e4a9e880 @fullpath="/store/add_to_cart/2", @env={...}, @method="GET", @filtered_parameters={"controller"=>"store", "id"=>"2", "action"=>"add_to_cart"}, @request_method="GET">, @lookup_context=#<ActionView::LookupContext:0x7f47e4a9dc00 @view_paths=[#<ActionView::FileSystemResolver:0x7f47e4c8fe00 @caching=false, @path="/home/rubys/git/awdwr/edition3/work-187-30/depot/app/views", @cached={}>], @details_key=nil, @skip_default_locale=false, @details={:formats=>[:html], :locale=>[:en, :en], :handlers=>[:erb, :rjs, :builder, :rhtml, :rxml]}, @frozen_formats=false>, @_env={...}, @_headers={"Content-Type"=>"text/html"}, @view_context_class=nil, @action_has_layout=true, @_action_name="add_to_cart">, "rack.errors"=>#<IO:0x7f47ea5ecac0>, "rack.multithread"=>false, "HTTP_HOST"=>"localhost:3000", "action_dispatch.request.formats"=>[#<Mime::Type:0x7f47e79aca78 @synonyms=["application/xhtml+xml"], @string="text/html", @symbol=:html>], "action_dispatch.request.accepts"=>[#<Mime::Type:0x7f47e79aca78 @synonyms=["application/xhtml+xml"], @string="text/html", @symbol=:html>], "action_dispatch.request.content_type"=>nil, "action_dispatch.show_exceptions"=>true, "HTTP_VERSION"=>"HTTP/1.1", "rack.request.cookie_hash"=>{"HttpOnly"=>nil, "path"=>"/", "_session_id"=>"6c50900ddd59c8600e990c2893f9c043"}, "rack.request.cookie_string"=>"_session_id=6c50900ddd59c8600e990c2893f9c043; path=/; HttpOnly", "rack.url_scheme"=>"http", "SERVER_PROTOCOL"=>"HTTP/1.1", "SERVER_NAME"=>"localhost", "action_dispatch.request.parameters"=>{"controller"=>"store", "id"=>"2", "action"=>"add_to_cart"}, "rack.session.options"=>{:expire_after=>nil, :httponly=>true, :secure=>false, :domain=>nil, :id=>"6c50900ddd59c8600e990c2893f9c043", :path=>"/"}, "rack.multiprocess"=>false, "SERVER_PORT"=>"3000", "rack.request.query_hash"=>{}, "rack.input"=>#<StringIO:0x7f47e4b35550>, "HTTP_COOKIE"=>"_session_id=6c50900ddd59c8600e990c2893f9c043; path=/; HttpOnly", "rack.version"=>[1, 1], "HTTP_ACCEPT"=>"text/html", "QUERY_STRING"=>"", "PATH_INFO"=>"/store/add_to_cart/2", "action_dispatch.request.query_parameters"=>{}, "action_dispatch.request.request_parameters"=>{}, "action_dispatch.request.path_parameters"=>{:controller=>"store", :action=>"add_to_cart", :id=>"2"}, "REQUEST_URI"=>"http://localhost:3000/store/add_to_cart/2", "rack.request.query_string"=>"", "rack.session"=>{"cart"=>#<Cart:0x7f47e4aefa00 @items=[#<Product id: 2, title: "Pragmatic Project Automation", description: "<p>\n <em>Pragmatic Project Automation</em> sh...", image_url: "/images/auto.jpg", created_at: "2012-12-16 14:12:23", updated_at: "2012-12-16 14:12:23", price: #<BigDecimal:7f47e4981150,'0.2995E2',18(18)>>, #<Product id: 3, title: "Pragmatic Version Control", description: "<p>\n This book is a recipe-based approach t...", image_url: "/images/svn.jpg", created_at: "2012-12-16 14:12:23", updated_at: "2012-12-16 14:12:23", price: #<BigDecimal:7f47e4980818,'0.285E2',18(18)>>]>}, "action_dispatch.secret_token"=>"358ebe998fa7e1b358d68338f154d0e76dc5b76492b864e18679666f986461cef38328e3177aa10fb0611b3554cabe97f80baa7dac807a99798e688b91834655", "rack.run_once"=>false, "SCRIPT_NAME"=>"", "REQUEST_METHOD"=>"GET", "REMOTE_ADDR"=>"192.168.1.100", "GATEWAY_INTERFACE"=>"CGI/1.1"}, @trusted_proxies=/(^127\.0\.0\.1$|^(10|172\.(1[6-9]|2[0-9]|30|31)|192\.168)\.)/i, @check_ip_spoofing=true> action_dispatch.request.accepts: [#<Mime::Type:0x7f47e79aca78 @synonyms=["application/xhtml+xml"], @string="text/html", @symbol=:html>] action_dispatch.request.content_type: nil action_dispatch.request.formats: [#<Mime::Type:0x7f47e79aca78 @synonyms=["application/xhtml+xml"], @string="text/html", @symbol=:html>] action_dispatch.request.parameters: {"controller"=>"store", "id"=>"2", "action"=>"add_to_cart"} action_dispatch.request.path_parameters: {:controller=>"store", :action=>"add_to_cart", :id=>"2"} action_dispatch.request.query_parameters: {} action_dispatch.request.request_parameters: {} action_dispatch.secret_token: "358ebe998fa7e1b358d68338f154d0e76dc5b76492b864e18679666f986461cef38328e3177aa10fb0611b3554cabe97f80baa7dac807a99798e688b91834655" action_dispatch.show_exceptions: true rack.errors: #<IO:0x7f47ea5ecac0> rack.input: #<StringIO:0x7f47e4b35550> rack.multiprocess: false rack.multithread: false rack.request.cookie_hash: {"HttpOnly"=>nil, "path"=>"/", "_session_id"=>"6c50900ddd59c8600e990c2893f9c043"} rack.request.cookie_string: "_session_id=6c50900ddd59c8600e990c2893f9c043; path=/; HttpOnly" rack.request.query_hash: {} rack.request.query_string: "" rack.run_once: false rack.session: {"cart"=>#<Cart:0x7f47e4aefa00 @items=[#<Product id: 2, title: "Pragmatic Project Automation", description: "<p>\n <em>Pragmatic Project Automation</em> sh...", image_url: "/images/auto.jpg", created_at: "2012-12-16 14:12:23", updated_at: "2012-12-16 14:12:23", price: #<BigDecimal:7f47e497f1e8,'0.2995E2',18(18)>>, #<Product id: 3, title: "Pragmatic Version Control", description: "<p>\n This book is a recipe-based approach t...", image_url: "/images/svn.jpg", created_at: "2012-12-16 14:12:23", updated_at: "2012-12-16 14:12:23", price: #<BigDecimal:7f47e497e8b0,'0.285E2',18(18)>>]>} rack.session.options: {:expire_after=>nil, :httponly=>true, :secure=>false, :domain=>nil, :id=>"6c50900ddd59c8600e990c2893f9c043", :path=>"/"} rack.session.record: #<ActiveRecord::SessionStore::Session id: 1, session_id: "6c50900ddd59c8600e990c2893f9c043", data: "BAh7BiIJY2FydG86CUNhcnQGOgtAaXRlbXNbB286DFByb2R1Y3Q...", created_at: "2012-12-16 14:12:49", updated_at: "2012-12-16 14:12:50"> rack.url_scheme: "http" rack.version: [1, 1]
Headers:
None
rake db:sessions:clear
get /store/add_to_cart/2
get /store/add_to_cart/2
get /store/add_to_cart/3
get /store/add_to_cart/wibble
Couldn't find Product with ID=wibble
Rails.root: /home/rubys/git/awdwr/edition3/work-187-30/depot
app/controllers/store_controller.rb:9:in `add_to_cart'
/home/rubys/git/rails/activerecord/lib/active_record/relation/finder_methods.rb:306:in `find_one'
/home/rubys/git/rails/activerecord/lib/active_record/relation/finder_methods.rb:291:in `find_with_ids'
/home/rubys/git/rails/activerecord/lib/active_record/relation/finder_methods.rb:107:in `find'
/home/rubys/git/rails/activerecord/lib/active_record/base.rb:444:in `__send__'
/home/rubys/git/rails/activerecord/lib/active_record/base.rb:444:in `find'
/home/rubys/git/rails/actionpack/lib/action_controller/metal/implicit_render.rb:4:in `send_action'
/home/rubys/git/rails/actionpack/lib/action_controller/metal/implicit_render.rb:4:in `send_action'
/home/rubys/git/rails/actionpack/lib/abstract_controller/base.rb:150:in `process_action'
/home/rubys/git/rails/actionpack/lib/action_controller/metal/rendering.rb:11:in `process_action'
/home/rubys/git/rails/actionpack/lib/abstract_controller/callbacks.rb:18:in `process_action'
/home/rubys/git/rails/activesupport/lib/active_support/callbacks.rb:436:in `_run__904638583__process_action__1049483489__callbacks'
/home/rubys/git/rails/activesupport/lib/active_support/callbacks.rb:410:in `send'
/home/rubys/git/rails/activesupport/lib/active_support/callbacks.rb:410:in `_run_process_action_callbacks'
/home/rubys/git/rails/activesupport/lib/active_support/callbacks.rb:94:in `send'
/home/rubys/git/rails/activesupport/lib/active_support/callbacks.rb:94:in `run_callbacks'
/home/rubys/git/rails/actionpack/lib/abstract_controller/callbacks.rb:17:in `process_action'
/home/rubys/git/rails/actionpack/lib/action_controller/metal/rescue.rb:17:in `process_action'
/home/rubys/git/rails/actionpack/lib/action_controller/metal/instrumentation.rb:30:in `process_action'
/home/rubys/git/rails/activesupport/lib/active_support/notifications.rb:52:in `instrument'
/home/rubys/git/rails/activesupport/lib/active_support/notifications/instrumenter.rb:21:in `instrument'
/home/rubys/git/rails/activesupport/lib/active_support/notifications.rb:52:in `instrument'
/home/rubys/git/rails/actionpack/lib/action_controller/metal/instrumentation.rb:29:in `process_action'
/home/rubys/git/rails/actionpack/lib/abstract_controller/base.rb:119:in `process'
/home/rubys/git/rails/actionpack/lib/abstract_controller/rendering.rb:41:in `process'
/home/rubys/git/rails/actionpack/lib/action_controller/metal.rb:138:in `dispatch'
/home/rubys/git/rails/actionpack/lib/action_controller/metal/rack_delegation.rb:14:in `dispatch'
/home/rubys/git/rails/actionpack/lib/action_controller/metal.rb:178:in `action'
/home/rubys/git/rails/actionpack/lib/action_dispatch/routing/route_set.rb:68:in `call'
/home/rubys/git/rails/actionpack/lib/action_dispatch/routing/route_set.rb:68:in `dispatch'
/home/rubys/git/rails/actionpack/lib/action_dispatch/routing/route_set.rb:33:in `call'
rack-mount (0.6.14) lib/rack/mount/route_set.rb:148:in `call'
rack-mount (0.6.14) lib/rack/mount/code_generation.rb:93:in `recognize'
rack-mount (0.6.14) lib/rack/mount/code_generation.rb:75:in `optimized_each'
rack-mount (0.6.14) lib/rack/mount/code_generation.rb:92:in `recognize'
rack-mount (0.6.14) lib/rack/mount/route_set.rb:139:in `call'
/home/rubys/git/rails/actionpack/lib/action_dispatch/routing/route_set.rb:499:in `call'
/home/rubys/git/rails/actionpack/lib/action_dispatch/middleware/best_standards_support.rb:17:in `call'
/home/rubys/git/rails/actionpack/lib/action_dispatch/middleware/head.rb:14:in `call'
rack (1.2.5) lib/rack/methodoverride.rb:24:in `call'
/home/rubys/git/rails/actionpack/lib/action_dispatch/middleware/params_parser.rb:21:in `call'
/home/rubys/git/rails/actionpack/lib/action_dispatch/middleware/flash.rb:182:in `call'
/home/rubys/git/rails/actionpack/lib/action_dispatch/middleware/session/abstract_store.rb:149:in `call'
/home/rubys/git/rails/actionpack/lib/action_dispatch/middleware/cookies.rb:302:in `call'
/home/rubys/git/rails/activerecord/lib/active_record/query_cache.rb:32:in `call'
/home/rubys/git/rails/activerecord/lib/active_record/connection_adapters/abstract/query_cache.rb:28:in `cache'
/home/rubys/git/rails/activerecord/lib/active_record/query_cache.rb:12:in `cache'
/home/rubys/git/rails/activerecord/lib/active_record/query_cache.rb:31:in `call'
/home/rubys/git/rails/activerecord/lib/active_record/connection_adapters/abstract/connection_pool.rb:354:in `call'
/home/rubys/git/rails/actionpack/lib/action_dispatch/middleware/callbacks.rb:46:in `call'
/home/rubys/git/rails/activesupport/lib/active_support/callbacks.rb:416:in `_run_call_callbacks'
/home/rubys/git/rails/actionpack/lib/action_dispatch/middleware/callbacks.rb:44:in `call'
rack (1.2.5) lib/rack/sendfile.rb:106:in `call'
/home/rubys/git/rails/actionpack/lib/action_dispatch/middleware/remote_ip.rb:48:in `call'
/home/rubys/git/rails/actionpack/lib/action_dispatch/middleware/show_exceptions.rb:47:in `call'
/home/rubys/git/rails/railties/lib/rails/rack/logger.rb:13:in `call'
rack (1.2.5) lib/rack/runtime.rb:17:in `call'
/home/rubys/git/rails/activesupport/lib/active_support/cache/strategy/local_cache.rb:72:in `call'
rack (1.2.5) lib/rack/lock.rb:13:in `call'
rack (1.2.5) lib/rack/lock.rb:13:in `synchronize'
rack (1.2.5) lib/rack/lock.rb:13:in `call'
/home/rubys/git/rails/actionpack/lib/action_dispatch/middleware/static.rb:30:in `call'
/home/rubys/git/rails/railties/lib/rails/application.rb:168:in `call'
/home/rubys/git/rails/railties/lib/rails/application.rb:77:in `send'
/home/rubys/git/rails/railties/lib/rails/application.rb:77:in `method_missing'
/home/rubys/git/rails/railties/lib/rails/rack/log_tailer.rb:14:in `call'
rack (1.2.5) lib/rack/content_length.rb:13:in `call'
rack (1.2.5) lib/rack/handler/webrick.rb:52:in `service'
/home/rubys/.rvm/rubies/ruby-1.8.7-p371/lib/ruby/1.8/webrick/httpserver.rb:104:in `service'
/home/rubys/.rvm/rubies/ruby-1.8.7-p371/lib/ruby/1.8/webrick/httpserver.rb:65:in `run'
/home/rubys/.rvm/rubies/ruby-1.8.7-p371/lib/ruby/1.8/webrick/server.rb:173:in `start_thread'
/home/rubys/.rvm/rubies/ruby-1.8.7-p371/lib/ruby/1.8/webrick/server.rb:162:in `start'
/home/rubys/.rvm/rubies/ruby-1.8.7-p371/lib/ruby/1.8/webrick/server.rb:162:in `start_thread'
/home/rubys/.rvm/rubies/ruby-1.8.7-p371/lib/ruby/1.8/webrick/server.rb:95:in `start'
/home/rubys/.rvm/rubies/ruby-1.8.7-p371/lib/ruby/1.8/webrick/server.rb:92:in `each'
/home/rubys/.rvm/rubies/ruby-1.8.7-p371/lib/ruby/1.8/webrick/server.rb:92:in `start'
/home/rubys/.rvm/rubies/ruby-1.8.7-p371/lib/ruby/1.8/webrick/server.rb:23:in `start'
/home/rubys/.rvm/rubies/ruby-1.8.7-p371/lib/ruby/1.8/webrick/server.rb:82:in `start'
rack (1.2.5) lib/rack/handler/webrick.rb:13:in `run'
rack (1.2.5) lib/rack/server.rb:217:in `start'
/home/rubys/git/rails/railties/lib/rails/commands/server.rb:65:in `start'
/home/rubys/git/rails/railties/lib/rails/commands.rb:30
/home/rubys/git/rails/railties/lib/rails/commands.rb:27:in `tap'
/home/rubys/git/rails/railties/lib/rails/commands.rb:27
script/rails:6:in `require'
script/rails:6
/home/rubys/git/rails/activerecord/lib/active_record/relation/finder_methods.rb:306:in `find_one'
/home/rubys/git/rails/activerecord/lib/active_record/relation/finder_methods.rb:291:in `find_with_ids'
/home/rubys/git/rails/activerecord/lib/active_record/relation/finder_methods.rb:107:in `find'
/home/rubys/git/rails/activerecord/lib/active_record/base.rb:444:in `__send__'
/home/rubys/git/rails/activerecord/lib/active_record/base.rb:444:in `find'
app/controllers/store_controller.rb:9:in `add_to_cart'
/home/rubys/git/rails/actionpack/lib/action_controller/metal/implicit_render.rb:4:in `send_action'
/home/rubys/git/rails/actionpack/lib/action_controller/metal/implicit_render.rb:4:in `send_action'
/home/rubys/git/rails/actionpack/lib/abstract_controller/base.rb:150:in `process_action'
/home/rubys/git/rails/actionpack/lib/action_controller/metal/rendering.rb:11:in `process_action'
/home/rubys/git/rails/actionpack/lib/abstract_controller/callbacks.rb:18:in `process_action'
/home/rubys/git/rails/activesupport/lib/active_support/callbacks.rb:436:in `_run__904638583__process_action__1049483489__callbacks'
/home/rubys/git/rails/activesupport/lib/active_support/callbacks.rb:410:in `send'
/home/rubys/git/rails/activesupport/lib/active_support/callbacks.rb:410:in `_run_process_action_callbacks'
/home/rubys/git/rails/activesupport/lib/active_support/callbacks.rb:94:in `send'
/home/rubys/git/rails/activesupport/lib/active_support/callbacks.rb:94:in `run_callbacks'
/home/rubys/git/rails/actionpack/lib/abstract_controller/callbacks.rb:17:in `process_action'
/home/rubys/git/rails/actionpack/lib/action_controller/metal/rescue.rb:17:in `process_action'
/home/rubys/git/rails/actionpack/lib/action_controller/metal/instrumentation.rb:30:in `process_action'
/home/rubys/git/rails/activesupport/lib/active_support/notifications.rb:52:in `instrument'
/home/rubys/git/rails/activesupport/lib/active_support/notifications/instrumenter.rb:21:in `instrument'
/home/rubys/git/rails/activesupport/lib/active_support/notifications.rb:52:in `instrument'
/home/rubys/git/rails/actionpack/lib/action_controller/metal/instrumentation.rb:29:in `process_action'
/home/rubys/git/rails/actionpack/lib/abstract_controller/base.rb:119:in `process'
/home/rubys/git/rails/actionpack/lib/abstract_controller/rendering.rb:41:in `process'
/home/rubys/git/rails/actionpack/lib/action_controller/metal.rb:138:in `dispatch'
/home/rubys/git/rails/actionpack/lib/action_controller/metal/rack_delegation.rb:14:in `dispatch'
/home/rubys/git/rails/actionpack/lib/action_controller/metal.rb:178:in `action'
/home/rubys/git/rails/actionpack/lib/action_dispatch/routing/route_set.rb:68:in `call'
/home/rubys/git/rails/actionpack/lib/action_dispatch/routing/route_set.rb:68:in `dispatch'
/home/rubys/git/rails/actionpack/lib/action_dispatch/routing/route_set.rb:33:in `call'
rack-mount (0.6.14) lib/rack/mount/route_set.rb:148:in `call'
rack-mount (0.6.14) lib/rack/mount/code_generation.rb:93:in `recognize'
rack-mount (0.6.14) lib/rack/mount/code_generation.rb:75:in `optimized_each'
rack-mount (0.6.14) lib/rack/mount/code_generation.rb:92:in `recognize'
rack-mount (0.6.14) lib/rack/mount/route_set.rb:139:in `call'
/home/rubys/git/rails/actionpack/lib/action_dispatch/routing/route_set.rb:499:in `call'
/home/rubys/git/rails/actionpack/lib/action_dispatch/middleware/best_standards_support.rb:17:in `call'
/home/rubys/git/rails/actionpack/lib/action_dispatch/middleware/head.rb:14:in `call'
rack (1.2.5) lib/rack/methodoverride.rb:24:in `call'
/home/rubys/git/rails/actionpack/lib/action_dispatch/middleware/params_parser.rb:21:in `call'
/home/rubys/git/rails/actionpack/lib/action_dispatch/middleware/flash.rb:182:in `call'
/home/rubys/git/rails/actionpack/lib/action_dispatch/middleware/session/abstract_store.rb:149:in `call'
/home/rubys/git/rails/actionpack/lib/action_dispatch/middleware/cookies.rb:302:in `call'
/home/rubys/git/rails/activerecord/lib/active_record/query_cache.rb:32:in `call'
/home/rubys/git/rails/activerecord/lib/active_record/connection_adapters/abstract/query_cache.rb:28:in `cache'
/home/rubys/git/rails/activerecord/lib/active_record/query_cache.rb:12:in `cache'
/home/rubys/git/rails/activerecord/lib/active_record/query_cache.rb:31:in `call'
/home/rubys/git/rails/activerecord/lib/active_record/connection_adapters/abstract/connection_pool.rb:354:in `call'
/home/rubys/git/rails/actionpack/lib/action_dispatch/middleware/callbacks.rb:46:in `call'
/home/rubys/git/rails/activesupport/lib/active_support/callbacks.rb:416:in `_run_call_callbacks'
/home/rubys/git/rails/actionpack/lib/action_dispatch/middleware/callbacks.rb:44:in `call'
rack (1.2.5) lib/rack/sendfile.rb:106:in `call'
/home/rubys/git/rails/actionpack/lib/action_dispatch/middleware/remote_ip.rb:48:in `call'
/home/rubys/git/rails/actionpack/lib/action_dispatch/middleware/show_exceptions.rb:47:in `call'
/home/rubys/git/rails/railties/lib/rails/rack/logger.rb:13:in `call'
rack (1.2.5) lib/rack/runtime.rb:17:in `call'
/home/rubys/git/rails/activesupport/lib/active_support/cache/strategy/local_cache.rb:72:in `call'
rack (1.2.5) lib/rack/lock.rb:13:in `call'
rack (1.2.5) lib/rack/lock.rb:13:in `synchronize'
rack (1.2.5) lib/rack/lock.rb:13:in `call'
/home/rubys/git/rails/actionpack/lib/action_dispatch/middleware/static.rb:30:in `call'
/home/rubys/git/rails/railties/lib/rails/application.rb:168:in `call'
/home/rubys/git/rails/railties/lib/rails/application.rb:77:in `send'
/home/rubys/git/rails/railties/lib/rails/application.rb:77:in `method_missing'
/home/rubys/git/rails/railties/lib/rails/rack/log_tailer.rb:14:in `call'
rack (1.2.5) lib/rack/content_length.rb:13:in `call'
rack (1.2.5) lib/rack/handler/webrick.rb:52:in `service'
/home/rubys/.rvm/rubies/ruby-1.8.7-p371/lib/ruby/1.8/webrick/httpserver.rb:104:in `service'
/home/rubys/.rvm/rubies/ruby-1.8.7-p371/lib/ruby/1.8/webrick/httpserver.rb:65:in `run'
/home/rubys/.rvm/rubies/ruby-1.8.7-p371/lib/ruby/1.8/webrick/server.rb:173:in `start_thread'
/home/rubys/.rvm/rubies/ruby-1.8.7-p371/lib/ruby/1.8/webrick/server.rb:162:in `start'
/home/rubys/.rvm/rubies/ruby-1.8.7-p371/lib/ruby/1.8/webrick/server.rb:162:in `start_thread'
/home/rubys/.rvm/rubies/ruby-1.8.7-p371/lib/ruby/1.8/webrick/server.rb:95:in `start'
/home/rubys/.rvm/rubies/ruby-1.8.7-p371/lib/ruby/1.8/webrick/server.rb:92:in `each'
/home/rubys/.rvm/rubies/ruby-1.8.7-p371/lib/ruby/1.8/webrick/server.rb:92:in `start'
/home/rubys/.rvm/rubies/ruby-1.8.7-p371/lib/ruby/1.8/webrick/server.rb:23:in `start'
/home/rubys/.rvm/rubies/ruby-1.8.7-p371/lib/ruby/1.8/webrick/server.rb:82:in `start'
rack (1.2.5) lib/rack/handler/webrick.rb:13:in `run'
rack (1.2.5) lib/rack/server.rb:217:in `start'
/home/rubys/git/rails/railties/lib/rails/commands/server.rb:65:in `start'
/home/rubys/git/rails/railties/lib/rails/commands.rb:30
/home/rubys/git/rails/railties/lib/rails/commands.rb:27:in `tap'
/home/rubys/git/rails/railties/lib/rails/commands.rb:27
script/rails:6:in `require'
script/rails:6
Parameters:
{"id"=>"wibble"}
cart: #<Cart:0x7f47e4a99858 @items=[#<CartItem:0x7f47e4a996f0 @quantity=2, @product=#<Product id: 2, title: "Pragmatic Project Automation", description: "<p>\n <em>Pragmatic Project Automation</em> sh...", image_url: "/images/auto.jpg", created_at: "2012-12-16 14:12:23", updated_at: "2012-12-16 14:12:23", price: #<BigDecimal:7f47e49555f0,'0.2995E2',18(18)>>>, #<CartItem:0x7f47e4a98200 @quantity=1, @product=#<Product id: 3, title: "Pragmatic Version Control", description: "<p>\n This book is a recipe-based approach t...", image_url: "/images/svn.jpg", created_at: "2012-12-16 14:12:23", updated_at: "2012-12-16 14:12:23", price: #<BigDecimal:7f47e4954650,'0.285E2',18(18)>>>]>
GATEWAY_INTERFACE: "CGI/1.1" HTTP_ACCEPT: "text/html" HTTP_COOKIE: "_session_id=6c50900ddd59c8600e990c2893f9c043; path=/; HttpOnly" HTTP_HOST: "localhost:3000" HTTP_VERSION: "HTTP/1.1" PATH_INFO: "/store/add_to_cart/wibble" QUERY_STRING: "" REMOTE_ADDR: "192.168.1.100" REMOTE_HOST: "rubix.local" REQUEST_METHOD: "GET" REQUEST_PATH: "/" REQUEST_URI: "http://localhost:3000/store/add_to_cart/wibble" SCRIPT_NAME: "" SERVER_NAME: "localhost" SERVER_PORT: "3000" SERVER_PROTOCOL: "HTTP/1.1" SERVER_SOFTWARE: "WEBrick/1.3.1 (Ruby/1.8.7/2012-10-12)" action_controller.instance: #<StoreController:0x7f47e4a57408 @_params={"controller"=>"store", "id"=>"wibble", "action"=>"add_to_cart"}, @_config=#<OrderedHash {}>, @_response=#<ActionDispatch::Response:0x7f47e4a57200 @etag=nil, @status=200, @writer=#<Proc:0x00007f47e645f148@/home/rubys/git/rails/actionpack/lib/action_dispatch/http/response.rb:43>, @blank=false, @sending_file=false, @cache_control={}, @cookie=[], @body=[], @header={}, @request=#<ActionDispatch::Request:0x7f47e4a57318 @fullpath="/store/add_to_cart/wibble", @env={"rack.session.record"=>#<ActiveRecord::SessionStore::Session id: 2, session_id: "6c50900ddd59c8600e990c2893f9c043", data: "BAh7BiIJY2FydG86CUNhcnQGOgtAaXRlbXNbB286DUNhcnRJdGV...", created_at: "2012-12-16 14:12:54", updated_at: "2012-12-16 14:12:55">, "action_dispatch.parameter_filter"=>[:password], "REMOTE_HOST"=>"rubix.local", "action_dispatch.remote_ip"=>#<ActionDispatch::RemoteIp::RemoteIpGetter:0x7f47e4afc368 @env={...}, @trusted_proxies=/(^127\.0\.0\.1$|^(10|172\.(1[6-9]|2[0-9]|30|31)|192\.168)\.)/i, @check_ip_spoofing=true>, "REQUEST_PATH"=>"/", "SERVER_SOFTWARE"=>"WEBrick/1.3.1 (Ruby/1.8.7/2012-10-12)", "action_controller.instance"=>#<StoreController:0x7f47e4a57408 ...>, "rack.errors"=>#<IO:0x7f47ea5ecac0>, "rack.multithread"=>false, "HTTP_HOST"=>"localhost:3000", "action_dispatch.request.formats"=>[#<Mime::Type:0x7f47e79aca78 @synonyms=["application/xhtml+xml"], @string="text/html", @symbol=:html>], "action_dispatch.request.accepts"=>[#<Mime::Type:0x7f47e79aca78 @synonyms=["application/xhtml+xml"], @string="text/html", @symbol=:html>], "action_dispatch.request.content_type"=>nil, "action_dispatch.show_exceptions"=>true, "HTTP_VERSION"=>"HTTP/1.1", "rack.request.cookie_hash"=>{"HttpOnly"=>nil, "path"=>"/", "_session_id"=>"6c50900ddd59c8600e990c2893f9c043"}, "rack.request.cookie_string"=>"_session_id=6c50900ddd59c8600e990c2893f9c043; path=/; HttpOnly", "rack.url_scheme"=>"http", "SERVER_PROTOCOL"=>"HTTP/1.1", "SERVER_NAME"=>"localhost", "action_dispatch.request.parameters"=>{"controller"=>"store", "id"=>"wibble", "action"=>"add_to_cart"}, "rack.session.options"=>{:expire_after=>nil, :httponly=>true, :secure=>false, :domain=>nil, :id=>"6c50900ddd59c8600e990c2893f9c043", :path=>"/"}, "rack.multiprocess"=>false, "SERVER_PORT"=>"3000", "rack.request.query_hash"=>{}, "rack.input"=>#<StringIO:0x7f47e4afe758>, "HTTP_COOKIE"=>"_session_id=6c50900ddd59c8600e990c2893f9c043; path=/; HttpOnly", "rack.version"=>[1, 1], "HTTP_ACCEPT"=>"text/html", "QUERY_STRING"=>"", "PATH_INFO"=>"/store/add_to_cart/wibble", "action_dispatch.request.query_parameters"=>{}, "action_dispatch.request.request_parameters"=>{}, "action_dispatch.request.path_parameters"=>{:controller=>"store", :action=>"add_to_cart", :id=>"wibble"}, "REQUEST_URI"=>"http://localhost:3000/store/add_to_cart/wibble", "rack.request.query_string"=>"", "rack.session"=>{"cart"=>#<Cart:0x7f47e4a99858 @items=[#<CartItem:0x7f47e4a996f0 @quantity=2, @product=#<Product id: 2, title: "Pragmatic Project Automation", description: "<p>\n <em>Pragmatic Project Automation</em> sh...", image_url: "/images/auto.jpg", created_at: "2012-12-16 14:12:23", updated_at: "2012-12-16 14:12:23", price: #<BigDecimal:7f47e494f128,'0.2995E2',18(18)>>>, #<CartItem:0x7f47e4a98200 @quantity=1, @product=#<Product id: 3, title: "Pragmatic Version Control", description: "<p>\n This book is a recipe-based approach t...", image_url: "/images/svn.jpg", created_at: "2012-12-16 14:12:23", updated_at: "2012-12-16 14:12:23", price: #<BigDecimal:7f47e494e7a0,'0.285E2',18(18)>>>]>}, "action_dispatch.secret_token"=>"358ebe998fa7e1b358d68338f154d0e76dc5b76492b864e18679666f986461cef38328e3177aa10fb0611b3554cabe97f80baa7dac807a99798e688b91834655", "rack.run_once"=>false, "SCRIPT_NAME"=>"", "REQUEST_METHOD"=>"GET", "REMOTE_ADDR"=>"192.168.1.100", "GATEWAY_INTERFACE"=>"CGI/1.1"}, @method="GET", @filtered_parameters={"controller"=>"store", "id"=>"wibble", "action"=>"add_to_cart"}, @request_method="GET">, @length=0, @block=nil>, @_status=200, @_response_body=nil, @_request=#<ActionDispatch::Request:0x7f47e4a57318 @fullpath="/store/add_to_cart/wibble", @env={"rack.session.record"=>#<ActiveRecord::SessionStore::Session id: 2, session_id: "6c50900ddd59c8600e990c2893f9c043", data: "BAh7BiIJY2FydG86CUNhcnQGOgtAaXRlbXNbB286DUNhcnRJdGV...", created_at: "2012-12-16 14:12:54", updated_at: "2012-12-16 14:12:55">, "action_dispatch.parameter_filter"=>[:password], "REMOTE_HOST"=>"rubix.local", "action_dispatch.remote_ip"=>#<ActionDispatch::RemoteIp::RemoteIpGetter:0x7f47e4afc368 @env={...}, @trusted_proxies=/(^127\.0\.0\.1$|^(10|172\.(1[6-9]|2[0-9]|30|31)|192\.168)\.)/i, @check_ip_spoofing=true>, "REQUEST_PATH"=>"/", "SERVER_SOFTWARE"=>"WEBrick/1.3.1 (Ruby/1.8.7/2012-10-12)", "action_controller.instance"=>#<StoreController:0x7f47e4a57408 ...>, "rack.errors"=>#<IO:0x7f47ea5ecac0>, "rack.multithread"=>false, "HTTP_HOST"=>"localhost:3000", "action_dispatch.request.formats"=>[#<Mime::Type:0x7f47e79aca78 @synonyms=["application/xhtml+xml"], @string="text/html", @symbol=:html>], "action_dispatch.request.accepts"=>[#<Mime::Type:0x7f47e79aca78 @synonyms=["application/xhtml+xml"], @string="text/html", @symbol=:html>], "action_dispatch.request.content_type"=>nil, "action_dispatch.show_exceptions"=>true, "HTTP_VERSION"=>"HTTP/1.1", "rack.request.cookie_hash"=>{"HttpOnly"=>nil, "path"=>"/", "_session_id"=>"6c50900ddd59c8600e990c2893f9c043"}, "rack.request.cookie_string"=>"_session_id=6c50900ddd59c8600e990c2893f9c043; path=/; HttpOnly", "rack.url_scheme"=>"http", "SERVER_PROTOCOL"=>"HTTP/1.1", "SERVER_NAME"=>"localhost", "action_dispatch.request.parameters"=>{"controller"=>"store", "id"=>"wibble", "action"=>"add_to_cart"}, "rack.session.options"=>{:expire_after=>nil, :httponly=>true, :secure=>false, :domain=>nil, :id=>"6c50900ddd59c8600e990c2893f9c043", :path=>"/"}, "rack.multiprocess"=>false, "SERVER_PORT"=>"3000", "rack.request.query_hash"=>{}, "rack.input"=>#<StringIO:0x7f47e4afe758>, "HTTP_COOKIE"=>"_session_id=6c50900ddd59c8600e990c2893f9c043; path=/; HttpOnly", "rack.version"=>[1, 1], "HTTP_ACCEPT"=>"text/html", "QUERY_STRING"=>"", "PATH_INFO"=>"/store/add_to_cart/wibble", "action_dispatch.request.query_parameters"=>{}, "action_dispatch.request.request_parameters"=>{}, "action_dispatch.request.path_parameters"=>{:controller=>"store", :action=>"add_to_cart", :id=>"wibble"}, "REQUEST_URI"=>"http://localhost:3000/store/add_to_cart/wibble", "rack.request.query_string"=>"", "rack.session"=>{"cart"=>#<Cart:0x7f47e4a99858 @items=[#<CartItem:0x7f47e4a996f0 @quantity=2, @product=#<Product id: 2, title: "Pragmatic Project Automation", description: "<p>\n <em>Pragmatic Project Automation</em> sh...", image_url: "/images/auto.jpg", created_at: "2012-12-16 14:12:23", updated_at: "2012-12-16 14:12:23", price: #<BigDecimal:7f47e494bf28,'0.2995E2',18(18)>>>, #<CartItem:0x7f47e4a98200 @quantity=1, @product=#<Product id: 3, title: "Pragmatic Version Control", description: "<p>\n This book is a recipe-based approach t...", image_url: "/images/svn.jpg", created_at: "2012-12-16 14:12:23", updated_at: "2012-12-16 14:12:23", price: #<BigDecimal:7f47e494b5a0,'0.285E2',18(18)>>>]>}, "action_dispatch.secret_token"=>"358ebe998fa7e1b358d68338f154d0e76dc5b76492b864e18679666f986461cef38328e3177aa10fb0611b3554cabe97f80baa7dac807a99798e688b91834655", "rack.run_once"=>false, "SCRIPT_NAME"=>"", "REQUEST_METHOD"=>"GET", "REMOTE_ADDR"=>"192.168.1.100", "GATEWAY_INTERFACE"=>"CGI/1.1"}, @method="GET", @filtered_parameters={"controller"=>"store", "id"=>"wibble", "action"=>"add_to_cart"}, @request_method="GET">, @lookup_context=#<ActionView::LookupContext:0x7f47e4a56e90 @view_paths=[#<ActionView::FileSystemResolver:0x7f47e4c8fe00 @caching=false, @path="/home/rubys/git/awdwr/edition3/work-187-30/depot/app/views", @cached={}>], @details_key=nil, @skip_default_locale=false, @details={:formats=>[:html], :locale=>[:en, :en], :handlers=>[:erb, :rjs, :builder, :rhtml, :rxml]}, @frozen_formats=false>, @_env={"rack.session.record"=>#<ActiveRecord::SessionStore::Session id: 2, session_id: "6c50900ddd59c8600e990c2893f9c043", data: "BAh7BiIJY2FydG86CUNhcnQGOgtAaXRlbXNbB286DUNhcnRJdGV...", created_at: "2012-12-16 14:12:54", updated_at: "2012-12-16 14:12:55">, "action_dispatch.parameter_filter"=>[:password], "REMOTE_HOST"=>"rubix.local", "action_dispatch.remote_ip"=>#<ActionDispatch::RemoteIp::RemoteIpGetter:0x7f47e4afc368 @env={...}, @trusted_proxies=/(^127\.0\.0\.1$|^(10|172\.(1[6-9]|2[0-9]|30|31)|192\.168)\.)/i, @check_ip_spoofing=true>, "REQUEST_PATH"=>"/", "SERVER_SOFTWARE"=>"WEBrick/1.3.1 (Ruby/1.8.7/2012-10-12)", "action_controller.instance"=>#<StoreController:0x7f47e4a57408 ...>, "rack.errors"=>#<IO:0x7f47ea5ecac0>, "rack.multithread"=>false, "HTTP_HOST"=>"localhost:3000", "action_dispatch.request.formats"=>[#<Mime::Type:0x7f47e79aca78 @synonyms=["application/xhtml+xml"], @string="text/html", @symbol=:html>], "action_dispatch.request.accepts"=>[#<Mime::Type:0x7f47e79aca78 @synonyms=["application/xhtml+xml"], @string="text/html", @symbol=:html>], "action_dispatch.request.content_type"=>nil, "action_dispatch.show_exceptions"=>true, "HTTP_VERSION"=>"HTTP/1.1", "rack.request.cookie_hash"=>{"HttpOnly"=>nil, "path"=>"/", "_session_id"=>"6c50900ddd59c8600e990c2893f9c043"}, "rack.request.cookie_string"=>"_session_id=6c50900ddd59c8600e990c2893f9c043; path=/; HttpOnly", "rack.url_scheme"=>"http", "SERVER_PROTOCOL"=>"HTTP/1.1", "SERVER_NAME"=>"localhost", "action_dispatch.request.parameters"=>{"controller"=>"store", "id"=>"wibble", "action"=>"add_to_cart"}, "rack.session.options"=>{:expire_after=>nil, :httponly=>true, :secure=>false, :domain=>nil, :id=>"6c50900ddd59c8600e990c2893f9c043", :path=>"/"}, "rack.multiprocess"=>false, "SERVER_PORT"=>"3000", "rack.request.query_hash"=>{}, "rack.input"=>#<StringIO:0x7f47e4afe758>, "HTTP_COOKIE"=>"_session_id=6c50900ddd59c8600e990c2893f9c043; path=/; HttpOnly", "rack.version"=>[1, 1], "HTTP_ACCEPT"=>"text/html", "QUERY_STRING"=>"", "PATH_INFO"=>"/store/add_to_cart/wibble", "action_dispatch.request.query_parameters"=>{}, "action_dispatch.request.request_parameters"=>{}, "action_dispatch.request.path_parameters"=>{:controller=>"store", :action=>"add_to_cart", :id=>"wibble"}, "REQUEST_URI"=>"http://localhost:3000/store/add_to_cart/wibble", "rack.request.query_string"=>"", "rack.session"=>{"cart"=>#<Cart:0x7f47e4a99858 @items=[#<CartItem:0x7f47e4a996f0 @quantity=2, @product=#<Product id: 2, title: "Pragmatic Project Automation", description: "<p>\n <em>Pragmatic Project Automation</em> sh...", image_url: "/images/auto.jpg", created_at: "2012-12-16 14:12:23", updated_at: "2012-12-16 14:12:23", price: #<BigDecimal:7f47e4948a08,'0.2995E2',18(18)>>>, #<CartItem:0x7f47e4a98200 @quantity=1, @product=#<Product id: 3, title: "Pragmatic Version Control", description: "<p>\n This book is a recipe-based approach t...", image_url: "/images/svn.jpg", created_at: "2012-12-16 14:12:23", updated_at: "2012-12-16 14:12:23", price: #<BigDecimal:7f47e4948008,'0.285E2',18(18)>>>]>}, "action_dispatch.secret_token"=>"358ebe998fa7e1b358d68338f154d0e76dc5b76492b864e18679666f986461cef38328e3177aa10fb0611b3554cabe97f80baa7dac807a99798e688b91834655", "rack.run_once"=>false, "SCRIPT_NAME"=>"", "REQUEST_METHOD"=>"GET", "REMOTE_ADDR"=>"192.168.1.100", "GATEWAY_INTERFACE"=>"CGI/1.1"}, @_headers={"Content-Type"=>"text/html"}, @view_context_class=nil, @action_has_layout=true, @_action_name="add_to_cart"> action_dispatch.parameter_filter: [:password] action_dispatch.remote_ip: #<ActionDispatch::RemoteIp::RemoteIpGetter:0x7f47e4afc368 @env={"rack.session.record"=>#<ActiveRecord::SessionStore::Session id: 2, session_id: "6c50900ddd59c8600e990c2893f9c043", data: "BAh7BiIJY2FydG86CUNhcnQGOgtAaXRlbXNbB286DUNhcnRJdGV...", created_at: "2012-12-16 14:12:54", updated_at: "2012-12-16 14:12:55">, "action_dispatch.parameter_filter"=>[:password], "REMOTE_HOST"=>"rubix.local", "action_dispatch.remote_ip"=>#<ActionDispatch::RemoteIp::RemoteIpGetter:0x7f47e4afc368 ...>, "REQUEST_PATH"=>"/", "SERVER_SOFTWARE"=>"WEBrick/1.3.1 (Ruby/1.8.7/2012-10-12)", "action_controller.instance"=>#<StoreController:0x7f47e4a57408 @_params={"controller"=>"store", "id"=>"wibble", "action"=>"add_to_cart"}, @_config=#<OrderedHash {}>, @_response=#<ActionDispatch::Response:0x7f47e4a57200 @etag=nil, @status=200, @writer=#<Proc:0x00007f47e645f148@/home/rubys/git/rails/actionpack/lib/action_dispatch/http/response.rb:43>, @blank=false, @sending_file=false, @cache_control={}, @cookie=[], @body=[], @header={}, @request=#<ActionDispatch::Request:0x7f47e4a57318 @fullpath="/store/add_to_cart/wibble", @env={...}, @method="GET", @filtered_parameters={"controller"=>"store", "id"=>"wibble", "action"=>"add_to_cart"}, @request_method="GET">, @length=0, @block=nil>, @_status=200, @_response_body=nil, @_request=#<ActionDispatch::Request:0x7f47e4a57318 @fullpath="/store/add_to_cart/wibble", @env={...}, @method="GET", @filtered_parameters={"controller"=>"store", "id"=>"wibble", "action"=>"add_to_cart"}, @request_method="GET">, @lookup_context=#<ActionView::LookupContext:0x7f47e4a56e90 @view_paths=[#<ActionView::FileSystemResolver:0x7f47e4c8fe00 @caching=false, @path="/home/rubys/git/awdwr/edition3/work-187-30/depot/app/views", @cached={}>], @details_key=nil, @skip_default_locale=false, @details={:formats=>[:html], :locale=>[:en, :en], :handlers=>[:erb, :rjs, :builder, :rhtml, :rxml]}, @frozen_formats=false>, @_env={...}, @_headers={"Content-Type"=>"text/html"}, @view_context_class=nil, @action_has_layout=true, @_action_name="add_to_cart">, "rack.errors"=>#<IO:0x7f47ea5ecac0>, "rack.multithread"=>false, "HTTP_HOST"=>"localhost:3000", "action_dispatch.request.formats"=>[#<Mime::Type:0x7f47e79aca78 @synonyms=["application/xhtml+xml"], @string="text/html", @symbol=:html>], "action_dispatch.request.accepts"=>[#<Mime::Type:0x7f47e79aca78 @synonyms=["application/xhtml+xml"], @string="text/html", @symbol=:html>], "action_dispatch.request.content_type"=>nil, "action_dispatch.show_exceptions"=>true, "HTTP_VERSION"=>"HTTP/1.1", "rack.request.cookie_hash"=>{"HttpOnly"=>nil, "path"=>"/", "_session_id"=>"6c50900ddd59c8600e990c2893f9c043"}, "rack.request.cookie_string"=>"_session_id=6c50900ddd59c8600e990c2893f9c043; path=/; HttpOnly", "rack.url_scheme"=>"http", "SERVER_PROTOCOL"=>"HTTP/1.1", "SERVER_NAME"=>"localhost", "action_dispatch.request.parameters"=>{"controller"=>"store", "id"=>"wibble", "action"=>"add_to_cart"}, "rack.session.options"=>{:expire_after=>nil, :httponly=>true, :secure=>false, :domain=>nil, :id=>"6c50900ddd59c8600e990c2893f9c043", :path=>"/"}, "rack.multiprocess"=>false, "SERVER_PORT"=>"3000", "rack.request.query_hash"=>{}, "rack.input"=>#<StringIO:0x7f47e4afe758>, "HTTP_COOKIE"=>"_session_id=6c50900ddd59c8600e990c2893f9c043; path=/; HttpOnly", "rack.version"=>[1, 1], "HTTP_ACCEPT"=>"text/html", "QUERY_STRING"=>"", "PATH_INFO"=>"/store/add_to_cart/wibble", "action_dispatch.request.query_parameters"=>{}, "action_dispatch.request.request_parameters"=>{}, "action_dispatch.request.path_parameters"=>{:controller=>"store", :action=>"add_to_cart", :id=>"wibble"}, "REQUEST_URI"=>"http://localhost:3000/store/add_to_cart/wibble", "rack.request.query_string"=>"", "rack.session"=>{"cart"=>#<Cart:0x7f47e4a99858 @items=[#<CartItem:0x7f47e4a996f0 @quantity=2, @product=#<Product id: 2, title: "Pragmatic Project Automation", description: "<p>\n <em>Pragmatic Project Automation</em> sh...", image_url: "/images/auto.jpg", created_at: "2012-12-16 14:12:23", updated_at: "2012-12-16 14:12:23", price: #<BigDecimal:7f47e4944c28,'0.2995E2',18(18)>>>, #<CartItem:0x7f47e4a98200 @quantity=1, @product=#<Product id: 3, title: "Pragmatic Version Control", description: "<p>\n This book is a recipe-based approach t...", image_url: "/images/svn.jpg", created_at: "2012-12-16 14:12:23", updated_at: "2012-12-16 14:12:23", price: #<BigDecimal:7f47e49442a0,'0.285E2',18(18)>>>]>}, "action_dispatch.secret_token"=>"358ebe998fa7e1b358d68338f154d0e76dc5b76492b864e18679666f986461cef38328e3177aa10fb0611b3554cabe97f80baa7dac807a99798e688b91834655", "rack.run_once"=>false, "SCRIPT_NAME"=>"", "REQUEST_METHOD"=>"GET", "REMOTE_ADDR"=>"192.168.1.100", "GATEWAY_INTERFACE"=>"CGI/1.1"}, @trusted_proxies=/(^127\.0\.0\.1$|^(10|172\.(1[6-9]|2[0-9]|30|31)|192\.168)\.)/i, @check_ip_spoofing=true> action_dispatch.request.accepts: [#<Mime::Type:0x7f47e79aca78 @synonyms=["application/xhtml+xml"], @string="text/html", @symbol=:html>] action_dispatch.request.content_type: nil action_dispatch.request.formats: [#<Mime::Type:0x7f47e79aca78 @synonyms=["application/xhtml+xml"], @string="text/html", @symbol=:html>] action_dispatch.request.parameters: {"controller"=>"store", "id"=>"wibble", "action"=>"add_to_cart"} action_dispatch.request.path_parameters: {:controller=>"store", :action=>"add_to_cart", :id=>"wibble"} action_dispatch.request.query_parameters: {} action_dispatch.request.request_parameters: {} action_dispatch.secret_token: "358ebe998fa7e1b358d68338f154d0e76dc5b76492b864e18679666f986461cef38328e3177aa10fb0611b3554cabe97f80baa7dac807a99798e688b91834655" action_dispatch.show_exceptions: true rack.errors: #<IO:0x7f47ea5ecac0> rack.input: #<StringIO:0x7f47e4afe758> rack.multiprocess: false rack.multithread: false rack.request.cookie_hash: {"HttpOnly"=>nil, "path"=>"/", "_session_id"=>"6c50900ddd59c8600e990c2893f9c043"} rack.request.cookie_string: "_session_id=6c50900ddd59c8600e990c2893f9c043; path=/; HttpOnly" rack.request.query_hash: {} rack.request.query_string: "" rack.run_once: false rack.session: {"cart"=>#<Cart:0x7f47e4a99858 @items=[#<CartItem:0x7f47e4a996f0 @quantity=2, @product=#<Product id: 2, title: "Pragmatic Project Automation", description: "<p>\n <em>Pragmatic Project Automation</em> sh...", image_url: "/images/auto.jpg", created_at: "2012-12-16 14:12:23", updated_at: "2012-12-16 14:12:23", price: #<BigDecimal:7f47e4942c20,'0.2995E2',18(18)>>>, #<CartItem:0x7f47e4a98200 @quantity=1, @product=#<Product id: 3, title: "Pragmatic Version Control", description: "<p>\n This book is a recipe-based approach t...", image_url: "/images/svn.jpg", created_at: "2012-12-16 14:12:23", updated_at: "2012-12-16 14:12:23", price: #<BigDecimal:7f47e4942298,'0.285E2',18(18)>>>]>} rack.session.options: {:expire_after=>nil, :httponly=>true, :secure=>false, :domain=>nil, :id=>"6c50900ddd59c8600e990c2893f9c043", :path=>"/"} rack.session.record: #<ActiveRecord::SessionStore::Session id: 2, session_id: "6c50900ddd59c8600e990c2893f9c043", data: "BAh7BiIJY2FydG86CUNhcnQGOgtAaXRlbXNbB286DUNhcnRJdGV...", created_at: "2012-12-16 14:12:54", updated_at: "2012-12-16 14:12:55"> rack.url_scheme: "http" rack.version: [1, 1]
Headers:
None
8.4 Iteration C3: Handling Errors 8.2 Iteration C1: Creating a Cart