编程是我的爱好。

(九)-给购物车添加错误处理

上一篇 / 下一篇  2007-09-16 06:52:31 / 个人分类:编程语言

在上次的内容里,我们演示了怎样构建一个简单的购物车,这次的内容非常简单,给购物车添加错误处理。

 

对于Web系统来说,并发处理是一个无法回避的问题,我们来模仿一个并发冲突的情景:

1.        用户进入购物车页面,看到共有5种商品。

2.        管理员在后台维护商品列表,将5种商品中的一种删除掉。

3.        客户选中被删除掉的商品,添加到购物车。

在这种情况下,如果不作任何处理的话将会产生一个异常,而我们要作的,是处理这个异常,给用户显示一个商品不存在的错误提示。

 

1.        首先我们需要修改StoreControlleradd_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代码块来进行异常处理,其中使用了Railslogger来记录异常,异常信息可以在\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链接时会表示一个错误信息,如下图:
//function pageLoad() { Sys.WebForms.PageRequestManager.getInstance().add_initializeRequest(handleInitializeRequest); //Sys.WebForms.PageRequestManager.getInstance().add_endRequest(handleEndRequest); } function handleInitializeRequest(sender, args) { var prm = Sys.WebForms.PageRequestManager.getInstance(); var eid = args.get_postBackElement().id; if (eid.indexOf("DeleteLink")>0) { args.get_postBackElement().innerHTML = "正在删除..."; } else if (eid.indexOf("btnSubmit")>0) { document.getElementById("AjaxHolder_PostComment_ltSubmitMsg").innerHTML="正在提交..."; document.getElementById("AjaxHolder_PostComment_btnSubmit").disabled = true; } else if(eid.indexOf("refreshList")>0) { document.getElementById("AjaxHolder_PostComment_refreshList").innerHTML="正在刷新..."; } } function TempSave(ElementID) { try { CommentsPersistDiv.setAttribute("CommentContent",document.getElementById(ElementID).value); CommentsPersistDiv.save("CommentXMLStore"); } catch(ex) { } } function Restore(ElementID) { CommentsPersistDiv.load("CommentXMLStore"); document.getElementById(ElementID).value=CommentsPersistDiv.getAttribute("CommentContent"); }

TAG: ruby

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

日历

« 2009-01-07  
    123
45678910
11121314151617
18192021222324
25262728293031

数据统计

  • 访问量: 628
  • 日志数: 16
  • 建立时间: 2007-09-13
  • 更新时间: 2008-03-11

RSS订阅

Open Toolbar