2013-08-30 51 views
0

我是紅寶石軌道上的新手,我正在製作購物車,在哪裏沒有必要登錄將產品添加到購物車,而不是必須登錄才能在購物車中購買產品,因此,我不必將購物車保存在數據庫中,我需要在會話中保存購物車,購物車中有許多line_items,每個line_item都有一個產品,另一種情況是當用戶登錄時,在這種情況下,我必須將購物車存儲在數據庫中,此部分正在工作,但我需要的是將具有許多line_items的購物車添加到會話中,因爲用戶是註銷,我搜索,但無法找到有用的東西,我感謝任何幫助,任何想法,任何鏈接來解決我的問題。由於我如何從購物車只在會話中保存line_items

原諒我的英語不是我的母語

回答

1

的Rails讓你存儲在會話哈希信息的能力。我會建議在會話散列中添加一個鍵以存儲行項目數組。我會把這樣的事情在你的控制器,或應用程序控制器類似這樣的例子:

class ApplicationController < ActionController::Base 
    before_filter :build_temporary_cart 

    def build_temporary_cart 
    # This assumes that you check for logged in user using current_user 
    session[:temporary_shopping_cart] = [] unless current_user 
    end 
end 

當你的客人用戶點擊添加到購物車,你會在訂單項控制器或任何控制器,你做這樣的事使用添加物品的購物車:

session[:temporary_shopping_cart] << @line_item 

退房http://guides.rubyonrails.org/action_controller_overview.html#accessing-the-session有關訪問會話哈希的更多信息。

+0

感謝Nelson,這個信息真的很有用,但是如何查看current_user,我有一個current_user方法,但是這需要一個數據庫表來創建User.find(session [:user])並且恢復current_user,我該如何獲取沒有數據庫的current_cart或我需要數據庫中的會話表?謝謝 – Marion

+0

因此,如果您使用會話保存購物車,則不需要數據庫或會話表。會話將作爲cookie存儲在用戶的計算機上。這就是爲什麼這個過濾器依賴於current_user不存在的原因。如果用戶註冊,我會在用戶模型上創建一個after_filter,這將創建一個新的shopping_cart,從用戶會話中獲取它。 – NelsonW

0

我認爲更好的方法是隻在會話中存儲cart_id。然後,所有項目都儲存在數據庫中(同樣喜歡爲登錄用戶) 你可以做這樣的事情:

def current_cart 
    Cart.find(session[:cart_id] 
    Rescue ActiveRecord::RecordNotFound 
    cart = Cart.create 
    session[:cart_id] = cart.id 
end 

你必須創建車模型,它的has_many line_items並添加依賴摧毀

has_many :line_items , :dependent => :destroy 

並且在用戶完成購買後,您可以銷燬包含其中所有line_items的購物車項目。