2012-10-29 18 views
7

Sto sviluppando un carrello della spesa molto semplice e il problema che sto avendo è che se aggiungo più di uno dello stesso prodotto al mio carrello non vedo aumentare la quantità e sono invece solo vedere più versioni dell'articolo.Aggiungere articoli al carrello Ruby on Rails

Per esempio io veda:

1 x luce verde = £ 15 1 x luce verde = £ 15

piuttosto che vedere:

2 x luce verde = £ 30

Come posso fare in modo che il carrello acquisti verifichi più versioni nel carrello e poi le aggiunga insieme?

Attualmente ho:

Application Controller

def current_cart 
    if session[:cart_id] 
    @current_cart ||= Cart.find(session[:cart_id]) 
    end 
    if session[:cart_id].nil? 
    @current_cart = Cart.create! 
    session[:cart_id] = @current_cart.id 
    end 
    @current_cart 
    end 

Carrello controller

def show 
    @cart = current_cart 
    end 

carrello Modello

has_many :items 

def total_price 
    items.to_a.sum(&:full_price) 
end 

Carrello Mostra

<table id="line_items"> 
    <tr> 
    <th>Product</th> 
    <th>Qty</th> 
    <th class="price">Unit Price</th> 
    <th class="price">Full Price</th> 
    </tr> 

    <% for item in @cart.items %> 
    <tr class="<%= cycle :odd, :even %>"> 
     <td><%=h item.product.name %></td> 
     <td class="qty"><%= item.quantity %></td> 
     <td class="price"><%= gbp(item.unit_price) %></td> 
     <td class="price"><%= gbp(item.full_price) %></td> 
    </tr> 
    <% end %> 
<tr> 

    <td class="total price" colspan="4"> 
    Total: <%= gbp(@cart.total_price) %> 
    </td> 
    </tr> 
    </table> 

ULTERIORI INFORMAZIONI

Prodotti # Indice

<%= link_to "Add to Cart", line_items_path(:product_id => product), :method => :post %> 

Qualche consiglio le persone in grado di offrire sarebbe molto apprezzato. Grazie!

Nuova Setup - ingenerare errori Uninitialised Constant CartController

routes.rb

Checkout::Application.routes.draw do 

    ActiveAdmin.routes(self) 

    devise_for :admin_users, ActiveAdmin::Devise.config 

    post '/add_to_cart/:product_id' => 'cart#add_to_cart', :as => 'add_to_cart' 

    resources :carts 
    resources :products 
    resources :items 

    root :to => 'products#index' 

end 

Carrelli controller

class CartsController < ApplicationController 

    def show 
    @cart = current_cart 
    end 

    def add_to_cart 
     current_cart.add_item(params[:product_id]) 
     redirect_to carts_path(current_cart.id) 
    end 

end 

Carrelli Modello

class Cart < ActiveRecord::Base 
has_many :items 

def add_item(product_id) 
     item = items.where('product_id = ?', product_id).first 
    if item 
     # increase the quantity of product in cart 
     item.quantity + 1 
     save 
    else 
     # product does not exist in cart 
     product = Product.find(product_id) 
     items << product 
    end 
    save 
end 

def total_price 
    items.to_a.sum(&:full_price) 
end 
end 

Prodotto # Indice

<table class="jobs"> 
    <thead> 
     <tr> 
      <th scope="col" id="name">Product Code</th> 
      <th scope="col" id="company">Name</th> 
      <th scope="col" id="company">Price</th> 
      <th scope="col" id="company">Action</th> 
     </tr> 
    </thead> 

    <tbody> 
     <% @product.each do |product| %> 
     <tr>  
      <td><%= product.product_code %></td> 
      <td><%= product.name %></td> 
      <td><%= gbp(product.price) %></td> 
      <td><%= button_to "Add to Cart", add_to_cart_path(:product_id => product), :method => :post %></td> 
     </tr> 
     <% end %> 
    </tbody> 
</table> 
+3

come si aggiungono gli articoli? show code pls – Lichtamberg

+0

Ciao @Lichtamberg, ho aggiunto il link che uso per aggiungere il prodotto al mio carrello - Ho semplicemente passato il product_id attraverso un metodo post. Qualsiasi altro aiuto che puoi offrire sarebbe fantastico! grazie :) –

risposta

9

nel carrello Modello, creare un metodo chiamato

def add_item(product_id) 
    item = items.where('product_id = ?', product_id).first 
    if item 
    # increase the quantity of product in cart 
    item.quantity + 1 
    save 
    else 
    # product does not exist in cart 
    cart.items << Item.new(product_id: product_id, quantity: 1) 
    end 
    save 
end 

In routes.rb,

post '/add_to_cart/:product_id' => 'cart#add_to_cart', :as => 'add_to_cart' 

Cambia la tua Aggiungi al carrello rotta verso un add_to_cart chiamata metodo nel controller del carrello.

def add_to_cart 
    current_cart.add_item(params[:product_id]) 
    # redirect to shopping cart or whereever 
end 

Questo dovrebbe darvi l'idea di ciò che si desidera realizzare.

+0

sembra buono ...... – Lichtamberg

+0

Salve @ scarver2, mi sembra di aver colpito un errore "CartController costante non inizializzato" quando si tenta di aggiungere il mio articolo a un carrello. Ho aggiornato tutti i miei file sopra sotto il titolo 'New Setup'. Puoi vedere dove sto andando male? Grazie per l'aiuto! –

+0

Se hai una seconda domanda, devi pubblicarla come una nuova domanda su SO. Non impacchettare più di una domanda in una domanda. –