Witam
Jestem grafikiem, koderem html/css i kocham prototypować funkcjonalności serwisów www. Do niedawna użytkowałem gotowe rozwiązania typu Wordpress, jednak rozbudowa takich serwisów bez znajomości programowania w php ogranicza się do implementacji gotowych pluginów które niestety pod względem użytkowania od strony użytkownika pozostawiają wiele do życzenia. Dlatego właśnie postanowiłem nauczyć się programowania by mieć pełen wpływ na wygląd i zachowanie moich serwisów, wybór padł na RoR, będzie to mój pierwszy język.
Przechodząc do sedna, aktualnie przerabiam książkę Agile Programowanie w Rails Wydanie II (ta z opisem sklepu
), pracuje na ruby 1.8.7 i railsach 2.3.5, i zwiesiłem się na przechowywaniu sesji użytkownika. Książka opiera się na starych railsach gdzie sesja domyślnie trzymana jest w bazie danych, ja postanowiłem użyć cookies.
Aplikacja to lista książek z buttonem pod każdą pozycją, klikniecie powoduje dodanie jej do listy zakupów.
Nie umieszczam w cookies całej klasy którą jest książka (tytuł, opis, cena) bo plik cookies szybko by urósł powyżej 4kB, umieszczam tylko ID książki.
Tak wygląda <%= debug(@cart) %>:
[code]— !ruby/object:Cart
items:
- !ruby/object:CartItem
product: “2”
quantity: 1 - !ruby/object:CartItem
product: “2”
quantity: 1 - !ruby/object:CartItem
product: “2”
quantity: 1 - !ruby/object:CartItem
product: “1”
quantity: 1[/code]
Naprowadźcie mnie jak zamiast dodawać nową pozycje sprawdzić czy dana pozycja jest już w cookies iinkrementować quantity. Czy w ogóle to rozwiązanie jest sensowne?
W modelu Cart próbowałem skonstruować zapytania wyszukującego w cookies dane ID czyli “product” ale nic z moich kombinacji nie uzyskałem, liczę na podpowiedz.
Jak to rozkminie to na podstawie ID w cookies wyszukam dana książkę i wyświetlę informacje o niej (cena i ilością sztuk) w widoku.
Kontroler
[code]class StoreController < ApplicationController
def index
@products = Product.find_products_for_sale
end
def add_to_cart
@cart = find_cart
productid = params[:id]
@cart.add_product(productid)
end
def find_from_cart_id
end
private
def find_cart
session[:cart] ||= Cart.new
end
end[/code]
Model Cart
[code]class Cart
attr_accessor :items
def initialize
@items = []
end
def add_product(product)
current_item = ????
if current_item
current_item.increment_quantity
else
@items << CartItem.new(product)
end
end
def add_product0ld(product)
@items << product.id
end
end[/code]
Model CartItem
[code]class CartItem
attr_accessor :product, :quantity
def initialize(product)
@product = product
@quantity = 1
end
def increment_quantity
@quantity += 1
end
def title
@product.title
end
def price
@product.price * @quantity
end
end[/code]
Widok dla akcji add_to_cart
<h1>Twoj koszyk</h1>
<%= debug(@cart) %>