Agile Web Development with Rails, Edition 4

Agile Web Development with Rails, Edition 4

9.3 Iteration D3: Adding a button 9.1 Iteration D1: Finding a Cart

9.2 Iteration D2: Connecting Products to Carts

Create line item which connects products to carts'

Create the model object.

rails generate scaffold LineItem product_id:integer cart_id:integer
      invoke  active_record
      create    db/migrate/20100606143405_create_line_items.rb
      create    app/models/line_item.rb
      invoke    test_unit
      create      test/unit/line_item_test.rb
      create      test/fixtures/line_items.yml
       route  resources :line_items
      invoke  scaffold_controller
      create    app/controllers/line_items_controller.rb
      invoke    erb
      create      app/views/line_items
      create      app/views/line_items/index.html.erb
      create      app/views/line_items/edit.html.erb
      create      app/views/line_items/show.html.erb
      create      app/views/line_items/new.html.erb
      create      app/views/line_items/_form.html.erb
      invoke    test_unit
      create      test/functional/line_items_controller_test.rb
      invoke    helper
      create      app/helpers/line_items_helper.rb
      invoke      test_unit
      create        test/unit/helpers/line_items_helper_test.rb
      invoke  stylesheets
   identical    public/stylesheets/scaffold.css
rake db:migrate
mv 20100606143405_create_line_items.rb 20100301000003_create_line_items.rb
(in /home/rubys/svn/rails4/Book/util/work-193/depot)
==  CreateLineItems: migrating ================================================
-- create_table(:line_items)
   -> 0.0019s
==  CreateLineItems: migrated (0.0019s) =======================================
 

Cart has many line items.

edit app/models/cart.rb
class Cart < ActiveRecord::Base
  has_many :line_items, :dependent => :destroy
end

Product has many line items.

edit app/models/product.rb
class Product < ActiveRecord::Base
  has_many :line_items
 
  before_destroy :ensure_not_referenced_by_any_line_item
 
  # ensure that there are no line items referencing this product
  def ensure_not_referenced_by_any_line_item
    if line_items.count.zero?
      return true
    else
      errors[:base] << "Line Items present"
      return false
    end
  end
 
  #...

Line item belongs to both Cart and Product (But slightly more to the Cart). Also provide convenient access to the total price of the line item

edit app/models/line_item.rb
class LineItem < ActiveRecord::Base
  belongs_to :product
  belongs_to :cart
end

9.3 Iteration D3: Adding a button 9.1 Iteration D1: Finding a Cart