The Depot Application

The Depot Application

8.4 Iteration C3: Handling Errors 8.2 Iteration C1: Creating a Cart

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 %> &times; <%=h item.title %></li>
  <% end %>
</ul>
get /store/add_to_cart/2

NoMethodError in StoreController#add_to_cart

undefined method `product' for #<Product:0x85df3dc>

RAILS_ROOT: /home/rubys/git/awdwr/work-191-239/depot

Application Trace | Framework Trace | Full Trace
/home/rubys/git/awdwr/work-191-239/depot/vendor/rails/activerecord/lib/active_record/attribute_methods.rb:260:in `method_missing'
/home/rubys/git/awdwr/work-191-239/depot/app/models/cart.rb:10:in `block in add_product'
/home/rubys/git/awdwr/work-191-239/depot/app/models/cart.rb:10:in `each'
/home/rubys/git/awdwr/work-191-239/depot/app/models/cart.rb:10:in `find'
/home/rubys/git/awdwr/work-191-239/depot/app/models/cart.rb:10:in `add_product'
/home/rubys/git/awdwr/work-191-239/depot/app/controllers/store_controller.rb:11:in `add_to_cart'
/home/rubys/git/awdwr/work-191-239/depot/vendor/rails/actionpack/lib/action_controller/base.rb:1331:in `perform_action'
/home/rubys/git/awdwr/work-191-239/depot/vendor/rails/actionpack/lib/action_controller/filters.rb:617:in `call_filters'
/home/rubys/git/awdwr/work-191-239/depot/vendor/rails/actionpack/lib/action_controller/filters.rb:610:in `perform_action_with_filters'
/home/rubys/git/awdwr/work-191-239/depot/vendor/rails/actionpack/lib/action_controller/benchmarking.rb:68:in `block in perform_action_with_benchmark'
/home/rubys/git/awdwr/work-191-239/depot/vendor/rails/activesupport/lib/active_support/core_ext/benchmark.rb:17:in `block in ms'
/home/rubys/.rvm/rubies/ruby-1.9.1-p378/lib/ruby/1.9.1/benchmark.rb:309:in `realtime'
/home/rubys/git/awdwr/work-191-239/depot/vendor/rails/activesupport/lib/active_support/core_ext/benchmark.rb:17:in `ms'
/home/rubys/git/awdwr/work-191-239/depot/vendor/rails/actionpack/lib/action_controller/benchmarking.rb:68:in `perform_action_with_benchmark'
/home/rubys/git/awdwr/work-191-239/depot/vendor/rails/actionpack/lib/action_controller/rescue.rb:160:in `perform_action_with_rescue'
/home/rubys/git/awdwr/work-191-239/depot/vendor/rails/actionpack/lib/action_controller/flash.rb:151:in `perform_action_with_flash'
/home/rubys/git/awdwr/work-191-239/depot/vendor/rails/actionpack/lib/action_controller/base.rb:532:in `process'
/home/rubys/git/awdwr/work-191-239/depot/vendor/rails/actionpack/lib/action_controller/filters.rb:606:in `process_with_filters'
/home/rubys/git/awdwr/work-191-239/depot/vendor/rails/actionpack/lib/action_controller/base.rb:391:in `process'
/home/rubys/git/awdwr/work-191-239/depot/vendor/rails/actionpack/lib/action_controller/base.rb:386:in `call'
/home/rubys/git/awdwr/work-191-239/depot/vendor/rails/actionpack/lib/action_controller/routing/route_set.rb:438:in `call'

Request

Parameters:

{"id"=>"2"}

Show session dump

Response

Headers:

{"Cache-Control"=>"no-cache",
 "Content-Type"=>""}

rake db:sessions:clear
(in /home/rubys/git/awdwr/work-191-239/depot)

Restart the server.

get /store/add_to_cart/2

Your Pragmatic Cart

  • 1 × Pragmatic Project Automation
get /store/add_to_cart/2

Your Pragmatic Cart

  • 2 × Pragmatic Project Automation
get /store/add_to_cart/3

Your Pragmatic Cart

  • 2 × Pragmatic Project Automation
  • 1 × Pragmatic Version Control
get /store/add_to_cart/wibble

ActiveRecord::RecordNotFound in StoreController#add_to_cart

Couldn't find Product with ID=wibble

RAILS_ROOT: /home/rubys/git/awdwr/work-191-239/depot

Application Trace | Framework Trace | Full Trace
/home/rubys/git/awdwr/work-191-239/depot/vendor/rails/activerecord/lib/active_record/base.rb:1620:in `find_one'
/home/rubys/git/awdwr/work-191-239/depot/vendor/rails/activerecord/lib/active_record/base.rb:1603:in `find_from_ids'
/home/rubys/git/awdwr/work-191-239/depot/vendor/rails/activerecord/lib/active_record/base.rb:620:in `find'
/home/rubys/git/awdwr/work-191-239/depot/app/controllers/store_controller.rb:9:in `add_to_cart'
/home/rubys/git/awdwr/work-191-239/depot/vendor/rails/actionpack/lib/action_controller/base.rb:1331:in `perform_action'
/home/rubys/git/awdwr/work-191-239/depot/vendor/rails/actionpack/lib/action_controller/filters.rb:617:in `call_filters'
/home/rubys/git/awdwr/work-191-239/depot/vendor/rails/actionpack/lib/action_controller/filters.rb:610:in `perform_action_with_filters'
/home/rubys/git/awdwr/work-191-239/depot/vendor/rails/actionpack/lib/action_controller/benchmarking.rb:68:in `block in perform_action_with_benchmark'
/home/rubys/git/awdwr/work-191-239/depot/vendor/rails/activesupport/lib/active_support/core_ext/benchmark.rb:17:in `block in ms'
/home/rubys/.rvm/rubies/ruby-1.9.1-p378/lib/ruby/1.9.1/benchmark.rb:309:in `realtime'
/home/rubys/git/awdwr/work-191-239/depot/vendor/rails/activesupport/lib/active_support/core_ext/benchmark.rb:17:in `ms'
/home/rubys/git/awdwr/work-191-239/depot/vendor/rails/actionpack/lib/action_controller/benchmarking.rb:68:in `perform_action_with_benchmark'
/home/rubys/git/awdwr/work-191-239/depot/vendor/rails/actionpack/lib/action_controller/rescue.rb:160:in `perform_action_with_rescue'
/home/rubys/git/awdwr/work-191-239/depot/vendor/rails/actionpack/lib/action_controller/flash.rb:151:in `perform_action_with_flash'
/home/rubys/git/awdwr/work-191-239/depot/vendor/rails/actionpack/lib/action_controller/base.rb:532:in `process'
/home/rubys/git/awdwr/work-191-239/depot/vendor/rails/actionpack/lib/action_controller/filters.rb:606:in `process_with_filters'
/home/rubys/git/awdwr/work-191-239/depot/vendor/rails/actionpack/lib/action_controller/base.rb:391:in `process'
/home/rubys/git/awdwr/work-191-239/depot/vendor/rails/actionpack/lib/action_controller/base.rb:386:in `call'
/home/rubys/git/awdwr/work-191-239/depot/vendor/rails/actionpack/lib/action_controller/routing/route_set.rb:438:in `call'

Request

Parameters:

{"id"=>"wibble"}

Show session dump

Response

Headers:

{"Cache-Control"=>"no-cache",
 "Content-Type"=>""}

8.4 Iteration C3: Handling Errors 8.2 Iteration C1: Creating a Cart