# # Ruby on Rails # Sample code of a Controller # # From the Meta Cart project # http://bitdojo.net/meta_cart # # Original filename: store_controller.rb # class StoreController < ApplicationController before_filter :find_cart, :except => :empty_cart def index @products = Product.find_products_for_sale #@cart = find_cart @current_time = Time.now.strftime("%Y/%m/%d %H:%M") @visits = visit_counter session[:at_page] = "index" render :layout => false if request.xhr? end def how_to_pay session[:at_page] = "how_to_pay" render :layout => false if request.xhr? end def contact_us session[:at_page] = "contact_us" render :layout => false if request.xhr? end def visit_counter session[:counter] ||= 0 session[:counter] += 1 end def add_to_cart # reset the visit count when an item is added session[:counter] = nil product = find_product_by_id(params[:id]) #@cart = find_cart @current_item = @cart.add_product(product) redirect_to_index("Item added to cart") unless request.xhr? end def remove_from_cart product = find_product_by_id(params[:id]) #@cart = find_cart @current_item = @cart.remove_product(product) #if !request.xhr? # redirect_to_index("Removed one item from cart") #elsif (session[:at_page] == "checkout") && (@cart.total_items == 0) # redirect_to_index #end redirect_to_index("Removed one item from cart") unless request.xhr? end def find_product_by_id(id) begin product = Product.find(id) rescue ActiveRecord::RecordNotFound logger.error("Attempt to find invalid product #{params[:id]}") redirect_to_index("Invalid product") end return product end def empty_cart session[:cart] = nil redirect_to_index("Your cart is now empty") unless request.xhr? end def checkout session[:at_page] = "checkout" #@cart = find_cart if @cart.items.empty? redirect_to_index("Your cart is empty") else @order = Order.new end end def save_order #@cart = find_cart @order = Order.new(params[:order]) @order.status = Order::ORDER_STATUSES[0][1] @order.add_line_items_from_cart(@cart) if @order.save session[:cart] = nil #redirect_to_index("Thank you for your order") StoreMailer.deliver_confirm(@order) flash[:checkedout] = true redirect_to :action => :thank_you else render :action => :checkout end end def thank_you if flash[:checkedout].nil? redirect_to_index else flash[:checkedout] = nil end end def redirect_to_index(msg = nil) flash[:notice] = msg if msg redirect_to :action => :index end # private methods below private def find_cart @cart = (session[:cart] ||= Cart.new) end end