当 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.其他?
其实当你确定有这个 id 的时候就应该用 Model.find(id), 没有就应该抛出异常
不确定有没有 id 的时候用 Model.find_by_id(id)
不要 rescue find(id) 的异常
当 id 不存在时,Model.find(id) 会抛出错误 抛出的是 not_found 的异常呀,production 下就是 404 页面嘛。。。。干嘛还要 rescue_from 一下
#7 楼 @zhangyuan NewRelic 不会返回 RecordNotFound 的异常 production 下日志里也不会有错误信息,你只会看到渲染了 404
rescue_from 方法来自于 ActionDispatch::Rescue 这个 middleware,注意看它的源码,如果你指定了 rescue_from ActiveRecord::RecordNotFound, :with => :render_404,那么请求过程中的 ActiveRecord::RecordNotFound 异常就会直接传给 controller 中的 render_404 方法,不会被抛出来
非常抱歉,我想当然了,没有去验证。
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? 并做相应的处理