2013-05-08 3 views
0

В моей текущей настройке корзины покупок я даю пользователю возможность добавлять предметы в свою корзину в течение его сеанса. Тележка берет идентификатор сеанса и информацию о продукте и создает новую запись @cart.lineitems. Однако, когда сеанс пользователя заканчивается, их корзина не удаляется из базы данных. Это вызывает икоту в моем коде и оставляет грязный сланец. Мой вопрос: Как удалить текущую строку корзины при завершении сеанса пользователя?Очистить таблицу при завершении сеанса рельсов

Код:

Модели

class Views::CartsController < ApplicationController 
    layout 'views' 
    def show 
    @cart = current_cart 
    end 
end 

    class Views::Cart < ActiveRecord::Base 
     # attr_accessible :title, :body 
     has_many :line_items, :dependent => :destroy 
     has_one :order, :dependent => :destroy 

     def total_price 
     # convert to array so it doesn't try to do sum on database directly 
     line_items.to_a.sum(&:full_price) 
     end 
    end 
    class Views::LineItem < ActiveRecord::Base 
     attr_accessible :cart, :quantity, :image, :unit_price, :product_id, :album_id 
     belongs_to :cart 
     belongs_to :image 
     accepts_nested_attributes_for :image 

     def full_price 
     unit_price * quantity 
     end 
    end 

Контроллер

class Views::LineItemsController < ApplicationController 
    layout 'views' 
    def create 
    @product = Image.find(params[:product_id]) 
    @album = @product.album 
    attr = {:cart => current_cart, :album_id => @album.id, :product_id => @product.id, :quantity => 1, :unit_price => 10} 
    @current = Views::LineItem.find_by_product_id(@product.id) 
    if @current.nil? 
     Views::LineItem.create(attr) 
    else 
     @current.update_attributes(:quantity => @current.quantity + 1, :cart => current_cart) 
    end 
    # @line_item = @current ? Views::LineItem.create(:cart => current_cart, :album_id => @album.id, :product_id => @product.id, :quantity => 1, :unit_price => 10) : @current.update_attribute(:quantity, @current.quantity + 1) 
    flash[:notice] = "Added #{@product.title} to cart." 
    redirect_to current_cart_url 
    end 
    def destroy 
    @line_item = Views::LineItem.find(params[:id]) 
    if @line_item.quantity > 1 
     @line_item.update_attribute(:quantity, @line_item.quantity - 1) 
    else 
     @line_item.destroy 
    end 
    redirect_to current_cart_url 
    end 
end 

ответ

1

I может быть неправильным, но происходит от того, что вы сказали, что вы можете иметь что-то подобное в CartsController

class CartsController < ApplicationController 

     def destroy 
     @cart = current_cart #Get current cart 
     @cart.destroy #call destroy method on the current cart 
     session[:cart_id] = nil #Ensuring that user is deleting their own cart 
     respond_to do |format| 
      format.html { redirect_to(root_url, 
            :flash => {:error => 'Your cart is currently empty'}) } 
     end 
     end 
    end 

В качестве альтернативы можно было попробовать и работать с в соответствии с пунктом application_controller

def current_cart 
    if user_signed_in? 
     if session[:cart_id] 
     @current_cart ||= current_user.carts.find(session[:cart_id]) 
     if @current_cart.purchased_at || @current_cart.expired? 
      session[:cart_id] = nil 
     end 
     end 
     if session[:cart_id].nil? 
     @current_cart = current_user.carts.create! 
     session[:cart_id] ||= @current_cart.id 
     end 
    end 
    @current_cart 
    end 
+0

Я попробую это, спасибо –

+0

Единственное, что я могу установить, чтобы тележка «устарела», если пользователь ее никогда не удаляет? –

+0

@derek_duncan см. Мой альтернативный метод, который может сработать для вас – David

Смежные вопросы