使用begin rescue else end这种句法是ruby编程的常用方法。但是每个在涉及到查询的过程中都需要使用这个繁杂的语句,简直让人崩溃。
不让人崩溃的方法就是如何写一遍,可以让所有的凡是可能碰到类似错误的action都可以一种优雅的方式提示错误。这就是我们的目标。
通过搜索,看到rescue_from这个rails定义的方法,再通过console查询,发现它在ActionController模块的Base类中。它可以捕捉action执行过程中的错误。
如果是查不着记录,比如使用find(5),这样的语句,如果模型中没有这条记录,则会出现ActiveRecord::Error not found error这样的错误,这种错误,我们可以在application_controller这个全局控制器中定义这样一个拯救方法:
rescue_from ActiveRecord::RecordNotFound, :with => :record_not_found
或者如果发生路由错误,我们可以再增加一个rescue_from
rescue_from ActionController::RoutingError,:with=> :record_not_found
说明:
1、rescue_from后面第一个参数是错误类型,随着逐步了解rails的错误体系,可以在这里写更多的rescue,直到你消灭所有不可控的错误。
2、第二个参数是一个hash,record_not_found是一个处理方法,也就是错误来了,我要干什么。
简单定义record_not_found如下,最好放在protected或者private下:
def record_not_found
render :text=>'呵呵,你怎么又出错了'
end
这样做了以后,我们的action中就可以大胆的使用find(id)这样的语句,二不怕出错,或者当用户在url中进行任意篡改的时候,我们也心中有数,不至于使用public目录下的错误提醒代码,用红色message吓坏使用者了。
分享到:
相关推荐
Java Bean实际上相当于微软COM模型中的本地进程内COM组件,它是不能被跨进程访问的。Enterprise Java Bean 相当于DCOM,即分布式组件。它是基于Java的远程方法调用(RMI)技术的,所以EJB可以被远程访问(跨进程、跨...
• sample19.htm 一段错误的JavaScript代码(调试用) 第3章(\代码\第03章) • sample01.htm 转换成数字型 第4章(\代码\第04章) • sample01.htm 字符串直接量 • sample02....
1.2 JavaScript的应用范围 1.3 JavaScript的版本 1.4 一些值得留意的特性 禁忌及如何突破这些禁忌 1.5 安全性和执行效率 1.6 一个例子--JavaScript编写的计算器 1.7 学习和使用JavaScript的...
2.9 为什么不能用内建的==和!=操作符比较结构? 2.10结构传递和返回是如何实现的? 2.11 如何向接受结构参数的函数传入常量值?怎样创建无名的中间的常量结构值? 2.12 怎样从/向数据文件读/写结构? 结构...
2.9 为什么不能用内建的==和!=操作符比较结构? 26 2.10 结构传递和返回是如何实现的? 26 2.11 如何向接受结构参数的函数传入常量值?怎样创建无名的中间的常量结构值? 26 2.12 怎样从/向数据文件读/写结构...
Windows NT网络服务简介 DHCP简介 理解DHCP需求 理解DHCP处理DHCP范围的创建和配置 设置DHCP范围选项 WINS简介 理解WINS需求 理解WINS配置 DNS简介 理解DNS区 创建DNS主机记录 配置DNS服务器转发客户端请求 创建DNS...
Java Bean实际上相当于微软COM模型中的本地进程内COM组件,它是不能被跨进程访问的。Enterprise Java Bean 相当于DCOM,即分布式组件。它是基于Java的远程方法调用(RMI)技术的,所以EJB可以被远程访问(跨进程、跨...
7.8.4. 内建的动作助手 7.8.4.1. 动作堆栈(助手) 7.8.4.2. AutoComplete 7.8.4.2.1. AutoCompletion with Dojo 7.8.4.2.2. AutoCompletion with Scriptaculous 7.8.4.3. ContextSwitch and AjaxContext 7.8....
实际上,封装在程序和数据之间设置了一道栅栏,它可以阻止一部分的设计错误,不至 于涉足应用程序其他部分的数据。 2.2.3 消息 一个单独的对象一般不十分有用,而作为一员出现在包含有许多其他对象的大...
318 如何获取Windows的内建号? 319 如何获取Windows的版本名称? 320 如何获取当前文件夹的位置? 321 如何获取文件夹的根目录位置? 322 如何获取文件夹的上层目录位置? 323 如何获取文件夹中的所有文件? 324 如何...