Rails 提个疑问,请过来人帮忙确认下,这是否是书籍中的疏漏,针对 Agile Web Development with Rails,4rd Edition ,P132

crabby · 2012年05月12日 · 最后由 Crabby 回复于 2012年05月16日 · 3347 次阅读

请看过并实践过《web 开发敏捷之道,应用 Rails 进行敏捷 web 开发》,(第四版) 的过来人,帮忙确定一下,是否是书中的疏漏。

我看的是英文第四版,该书对应的中文第四版,我没有下载到:( ;该书中实践的是购物车

P132 页中的任务是处理错误异常 ITERATION E2: HANDLING ERRORS .如果客户在浏览器中,自己手工将站点中没有的产品加入进购物车,比如在浏览器中输入http://localhost:3000/carts/wibblewibble这个产品的ID并没有定义,如果不作任何的异常处理:一是系统给用户的出错提示太生硬,二也暴露了系统的设计,给黑客等提供了部分信息,存在安全隐患。该节的任务是加入错误异常处理,因为。

P132 页中,按照作者的指导,需要将购物车的控制器 cart_controller.rb 中的@cart = Cart.find(params[:id]) 加异常处理,方式是使用 rescue, 相关的代码如下。 app/controllers/carts_controller.rb def show begin @cart = Cart.find(params[:id]) rescue ActiveRecord::RecordNotFound logger.error "Attempt to access invalid cart #{params[:id]}" redirect_to store_url, :notice => 'Invalid cart' else respond_to do |format| format.html # show.html.erb format.xml { render :xml => @cart } end end end

操作完毕之后,结果如书中所述, 在后台日志中,rails 将前台用户的异常操作,记录进入 development.log 日志; 前台,将页面重新定向到http://localhost:3000, 实际的结果并没有如书中,图所示的,将很友好的 Invalid cart 在前台展示给用户。这个 Invalid cart 并没有出现

后来我找到了该书中文版第三版/中文版第二版 这两个版本中相应的章节却有说明: 先说中文第二版,在第二版 P107 页中有说:如果在前台需要展示出错的信息,需要将 flash 信息,需要将处理 flash 信息的代码放入布局文件中,所修改的是 app/views/layouts/store.rhtml ,另外还需要给提示框加上新的 css 样式,需要修改 public/stylesheets/depot.css 第三版中也有类似的说明,在第三版 P85 任务 8.4 迭代 C3:处理错误,也有同第二版中的说明:修改 store.rhtml 和相应的 depot.css 文件

但是我在第四版中未见相关的说明,全篇文档搜索相关的关键字也并没有找到类似说明;并且在官网下载的该项目源码中 (rails32 版),好像也没有什么说明。

请看过并且实践过此书中实例的前辈们,帮忙确认下,是否是书中的疏漏

另外,对这个 store_url, 自己有些疑问,不清出他的来源,有知道的也帮忙解答下,谢谢各位大虾了:)

只看过老版本的,rei 不是找了一大推错误吗,写个书,有错误也正常的 反正你知道把错误传给了 flash[:notice],页面上记得打出来就成了

你上传的图片上不是显示“Invalid cart”了吗? store_url 这个 ... ... 我只能告诉你命令‘rake routes’,其它的自己领悟吧。 不要急,慢慢来

一个可能是原因是 store_url 那里又做了一次 redirect。

我翻了翻中文版,你的例子在 91 页,我往回翻了翻,在 81 页看到 store 的页面模板,有大概这条内容

depot_f/app/views/store/index.html.erb

<% if notice %>
  <p id="notice"><%= notice %></p>
<% end %>

这应该是拿来显示 notice 的。

#3 楼 @leekelby 我贴的图,是从电子书里面粘贴进来的。我自己的购物车,并木有 : (

我看第四版的时候有啊,是不是前面处理 view 的时候你漏了?

#1 楼 @Crabby store_url 是个动态辅助方法,跟你在 config/routes.rb 里面的设置有关。详细的说明要在书的 20 章。

官方文档有专门的章节 http://guides.rubyonrails.org/routing.html

#2 楼 @azhao 嗯,rails32 的版本变化比较大,我之后照着第二版,第三版试着修改一下。额,我天真的以为,书籍的版本越高,越高档,咔咔 ~ 幸亏我还有 这书的中文第三版电子版,中文第二版纸质的,有疑问可以参考,:D

没看楼主具体介绍,不过要提及的是:第四版隐藏了太多的实现细节,我觉得反到不利于掌握 rails, 建议第三版第四版一起看。

先谢谢各位,我再看看

#5 楼 @Rei #7 楼 @jiffies #4 楼 @ashchan #2 楼 @azhao #10 楼 @zw963 #3 楼 @leekelby 结个帖。 谢谢各位的帮忙,这个我算明白了,其实不是书中的疏漏

尤其是 Rei 那一层楼的回复,我注意到了 notice 这个关键字眼,于是我去检查了一下我的 depot.css 文件。不晓得我的如下代码为啥子让我给弄丢了。后来我加上这个就好了~~ 说其实不是书中的疏漏 的原因在于,如果按照书中的步骤,在 P85 页中将全局的布局文件下载下来,就不会出现这样的问题。书中的 P85 页中的 depot.css 文件其实都已经将购物车中的 notice 写好了. 链接如下:http://media.pragprog.com/titles/rails4/code/rails30/depot_f/public/stylesheets/depot.css

关键性的代码是 #store #notice { color: #000; border: 2px solid red; padding: 1em; margin-bottom: 2em; background-color: #f0f0f0; font: bold smaller sans-serif; }

需要 登录 后方可回复, 如果你还没有账号请 注册新账号