End chapter 10
[depot.git] / app / controllers / store_controller.rb
index 9973d078727c334fc06a948e5bfe6c7a86ff0a56..de9e160be607cd54c7522ee77ad512f3ffa2640c 100644 (file)
@@ -1,6 +1,62 @@
 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 empty_cart
+    session[:cart] = nil
+    redirect_to_index unless request.xhr?
+  end
+
+  def checkout
+    @cart = find_cart
+    if @cart.items.empty?
+      redirect_to_index("Your cart is empty" )
+    else
+      @order = Order.new
+      respond_to do |format|
+        format.js if request.xhr?
+        format.html
+      end
+    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
+  
+
+ private
+  def find_cart
+    session[:cart] ||= Cart.new
+  end
+
+  def redirect_to_index(msg = nil)
+    flash[:notice] = msg if msg
+    redirect_to :action => 'index'
+  end
+  
 end