You will need to process your own session data - this does not mean that you will need a session model .
, http://www.firststopcosmeticshop.co.uk ( ). , , :
class CartSession
def initialize(session)
@session = session
@session[:cart] ||= {}
end
def cart_count
if (@session[:cart][:products] && @session[:cart][:products] != {})
@session[:cart][:products].count
else
0
end
end
def cart_contents
products = @session[:cart][:products]
if (products && products != {})
quantities = Hash[products.uniq.map {|i| [i, products.count(i)]}]
products_array = Product.find(products.uniq)
products_new = {}
products_array.each{
|a| products_new[a] = {"qty" => quantities[a.id.to_s]}
}
return products_new
end
end
def subtotal
products = cart_contents
subtotal = 0
unless products.blank?
products.each do |a|
subtotal += (a[0]["price"].to_f * a[1]["qty"].to_f)
end
end
return subtotal
end
def build_order
products = cart_contents
@order = []
products.each do |product|
@order << {name: product[0].name, quantity: product[1]["qty"], amount: (product[0].price * 100).to_i }
end
return @order
end
def build_json
session = @session[:cart][:products]
json = {:subtotal => self.subtotal.to_f.round(2), :qty => self.cart_count, :items => Hash[session.uniq.map {|i| [i, session.count(i)]}]}
return json
end
end
Rails :
. . , , , . Rails , . , .
, , cookie, . ( - , ), , .
Sessions raw id
Devise - , , Devise. Devise - , , ; .
Devise Sessions, session . cart :
get 'cart' => 'cart#index', :as => 'cart_index'
post 'cart/add/:id' => 'cart#add', :as => 'cart_add'
delete 'cart/remove(/:id(/:all))' => 'cart#delete', :as => 'cart_delete'
class CartController < ApplicationController
include ApplicationHelper
def index
@items = cart_session.cart_contents
@shipping = Shipping.all
end
def add
session[:cart] ||={}
products = session[:cart][:products]
if (products && products != {})
session[:cart][:products] << params[:id]
else
session[:cart][:products] = Array(params[:id])
end
respond_to do |format|
format.json { render json: cart_session.build_json }
format.html { redirect_to cart_index_path }
end
end
def delete
session[:cart] ||={}
products = session[:cart][:products]
id = params[:id]
all = params[:all]
unless id.blank?
unless all.blank?
products.delete(params['id'])
else
products.delete_at(products.index(id) || products.length)
end
else
products.delete
end
respond_to do |format|
format.json { render json: cart_session.build_json }
format.html { redirect_to cart_index_path }
end
end
end