瞎扯淡 find (id) 抛出错误时,大家更倾向于哪种解决方法?

icesky · 2012年06月11日 · 最后由 huacnlee 回复于 2012年06月12日 · 4583 次阅读

当 id 不存在时,Model.find(id)会抛出错误 大家更倾向于用哪种方式来解决比较好的? 1.@model = Model.find_by_id(id) 2.@model = Model.find(id) if Model.exists?(id)] 3.begin @model = Model.find(id) rescue ActiveRecord::RecordNotFound => e @model = nil end 4.其他?

rescue_from ActiveRecord::RecordNotFound, :with => :render_404

#1 楼 @pongyo 还有这方法,受教了 : )

其实当你确定有这个 id 的时候就应该用 Model.find(id), 没有就应该抛出异常

不确定有没有 id 的时候用 Model.find_by_id(id)

不要 rescue find(id) 的异常

匿名 #4 2012年06月11日

我习惯用 find_by_id, 判断是否 nil

#3 楼 @ltl3884 为什么不要 rescue find(id) 的异常呢? 现在在项目里避免用户随便输入个不存在的 id, 检查到 find_by_id(id) 为 nil 也跳转到一个 404 页面

当 id 不存在时,Model.find(id) 会抛出错误 抛出的是 not_found 的异常呀,production 下就是 404 页面嘛。。。。干嘛还要 rescue_from 一下

#6 楼 @ywencn

  1. 如果有人恶意爬取网站,就可能导致 find(id) 抛出异常,进而日志里大量的错误信息,但这些实质上就不是错误。反而会淹没正常的错误。如果用 NewRelic 等工具监控,就会看到很多 error。
  2. 抛出异常时,会 dump(这个词不知道用得对不对)出整个异常栈,这个栈可能很深,导致程序会慢一些。

#7 楼 @zhangyuan NewRelic 不会返回 RecordNotFound 的异常 production 下日志里也不会有错误信息,你只会看到渲染了 404

#7 楼 @zhangyuan

rescue_from 方法来自于 ActionDispatch::Rescue 这个 middleware,注意看它的源码,如果你指定了 rescue_from ActiveRecord::RecordNotFound, :with => :render_404,那么请求过程中的 ActiveRecord::RecordNotFound 异常就会直接传给 controller 中的 render_404 方法,不会被抛出来

#8 楼 @ywencn

非常抱歉,我想当然了,没有去验证。

NewRelic 我无法验证,但我在本地 production 跑了一下,production 日志会有如下类似的错误:

ActiveRecord::RecordNotFound (Couldn't find Post with id=1):
  app/controllers/posts_controller.rb:17:in `show'

异常信息并不多。

只有在 show 这个 action 里面用 find 以便于没有找到的时候会在产品环境直接 render 404

而其他地方则用 find_by_id 并判断是否 blank? 并做相应的处理

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