Finished chapter 11
[depot.git] / app / controllers / store_controller.rb
index 8234cdcb244d053025bcc790324fc63b1b74352e..4c13d34155c6624dbf1efbd0f0c465de7860986e 100644 (file)
@@ -1,15 +1,18 @@
 class StoreController < ApplicationController
+  before_filter :find_cart, :except => :empty_cart
+
   def index
     @products = Product.find_products_for_sale
-    @cart = find_cart
+#    @cart = find_cart
   end
 
   def add_to_cart
     product = Product.find(params[:id])
-    @cart = find_cart
+#    @cart = find_cart
     @current_item = @cart.add_product(product)
       respond_to do |format|
-        format.js
+        format.js if request.xhr?
+        format.html {redirect_to_index}
       end
   rescue ActiveRecord::RecordNotFound
     logger.error("Attempt to access invalid product #{params[:id]}" )
@@ -18,13 +21,54 @@ class StoreController < ApplicationController
   
   def empty_cart
     session[:cart] = nil
-    redirect_to_index('Your cart has been emptied')
+    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
+      @during_checkout = true
+      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)
+    @cart.items.each do |item|
+      li = LineItem.new
+      li.product      = item.product
+      li.quantity     = item.quantity
+      li.total_price  = item.price
+      @order.line_items << li
+    end
+    if @order.save
+      session[:cart] = nil
+      redirect_to_index("Thank you for your order")
+    else
+      render :action => 'checkout'
+    end
+    @during_checkout = false
   end
   
+
+protected
+
+  # No authorization needed for the store
+  def authorize
+  end
+
  private
  
   def find_cart
-    session[:cart] ||= Cart.new
+    @cart = (session[:cart] ||= Cart.new)
   end
 
   def redirect_to_index(msg = nil)