class ShoppingCartSession::Cart

Attributes

items[R]
total_price[R]

Public Class Methods

new(session) click to toggle source
# File lib/shopping_cart_session.rb, line 8
def initialize(session)
  @session = session
  @items = session.key?(:cart_items) ? deserialize_json_objects(session[:cart_items]) : []
  @items = @items.map { |item|
    item["amount"] = item["amount"].to_i
    item["price"] = item["price"].to_f
    item
  }
  @total_price = @items.reduce(0) { |sum, item| sum + item["price"].to_f * item["amount"] }
end

Public Instance Methods

add(product, amount = 1) click to toggle source
# File lib/shopping_cart_session.rb, line 19
def add(product, amount = 1)
  @total_price += product["price"].to_f

  products = @items.select { |p| p["id"].to_s == product.id.to_s }

  if products.length > 0 then
    products.first["amount"] += 1
  else
    @items.push({
      :id => product.id,
      :name => product.name,
      :price => product.price,
      :amount => amount
    })
  end

  update_session
end
empty() click to toggle source
# File lib/shopping_cart_session.rb, line 38
def empty
  @session[:cart_items] = ""
  @items = []
  @total_price = 0
end
remove(product) click to toggle source
# File lib/shopping_cart_session.rb, line 44
def remove(product)
  @total_price -= product["price"].to_f

  item = find_item(product)

  if item and item["amount"].to_i > 1 then
    item["amount"] -= 1
  else
    @items = @items.reject { |item| item["id"].to_s == product["id"].to_s }
  end

  update_session
end

Private Instance Methods

deserialize_json_objects(json_string) click to toggle source
# File lib/shopping_cart_session.rb, line 66
def deserialize_json_objects(json_string)
  split_json = json_string.gsub('[', '').gsub(']', '').split('}')
  hash_list = []

  for json_hash in split_json do

    json_hash = json_hash.gsub('{', '')

    if json_hash[0] == "," then
      json_hash[0] = ''
    end

    key_value_pairs = json_hash.split(',')

    parsed_hash = {}

    for kv in key_value_pairs do
      key_value = kv.split(':')

      key = key_value[0].gsub('"', '')
      value = key_value[1].gsub('"', '')

      parsed_hash[key] = value
    end
    hash_list.push(parsed_hash)
  end

  return hash_list
end
find_item(product) click to toggle source
# File lib/shopping_cart_session.rb, line 62
def find_item(product)
  @items.select { |item| item["id"].to_s == product["id"].to_s }.first
end
update_session() click to toggle source
# File lib/shopping_cart_session.rb, line 96
def update_session
  @session[:cart_items] = @items.to_json
end