在上次的內容裡,我們演示了怎樣構建一個簡單的購物車,這次的內容非常簡單,給購物車添加錯誤處理。
對於Web系統來說,並發處理是一個無法回避的問題,我們來模仿一個並發沖突的情景:
1.用戶進入購物車頁面,看到共有5種商品。
2.管理員在後台維護商品列表,將5種商品中的一種刪除掉。
3.客戶選中被刪除掉的商品,添加到購物車。
在這種情況下,如果不作任何處理的話將會產生一個異常,而我們要作的,是處理這個異常,給用戶顯示一個商品不存在的錯誤提示。
1.首先我們需要修改StoreController的add_to_cart方法,下面是add_to_cart方法的代碼:
def add_to_cart product = Product.find(params[:id]) @cart = find_cart @cart.add_product(product) redirect_to(:action => 'display_cart') rescue logger.error("Attempt to access invalid product #{params[:id]}") flash[:notice] = 'Invalid product' redirect_to(:action => 'index') end
2.修改rails_apps\depot\app\views\store目錄下的index.rhtml文件:
在<div id="main">這一句的後面添加下面的代碼:
<% if @flash[:notice] -%> <div id="notice"> <%= @flash[:notice] %></div> <% end -%>
然後在按照前面提到的3個步驟模擬一個並發沖突的情形,就會在頁面上表示的錯誤信息了,如下圖:
下面回頭來看看前面的代碼:
在add_to_cart方法裡,我們使用了rescue代碼塊來進行異常處理,其中使用了Rails的logger來記錄異常,異常信息可以在\rails_apps\depot\log目錄下的development.log文件裡找到。
在記錄的異常後,使用了flash,這是一個類似於HashTable的對象,用來存儲鍵和對應的內容。Rails使用flash來處理異常。
我們使用flash[:notice] = 'Invalid product'來確定異常信息的內容,然後在頁面上表示出來,在index.rhtml的代碼裡進行flash內容的表示:
<% if @flash[:notice] -%> <div id="notice"> <%= @flash[:notice] %></div> <% end -%>
下面我們再添加一點處理,當用戶的購物車為空的時候,點擊Show My Cart鏈接會表示一個錯誤信息,提示用戶購物車為空:
還是StoreController,修改display_cart方法如下:
def display_cart @cart = find_cart @items = @cart.items if @items.empty? flash[:notice] = "Your cart is currently empty" redirect_to(:action => 'index') end end
這樣當用戶第一次進入購物車頁面,不選擇任何商品,直接點擊Show My Cart鏈接時會表示一個錯誤信息,如下圖: