Rails:为什么find(id)会在rails中引发异常?

时间:2009-05-06 19:39:04

标签: ruby-on-rails activerecord

  

可能重复:
  Model.find(1) gives ActiveRecord error when id 1 does not exist

如果数据库中没有id为1的用户,则尝试User.find(1)将引发异常。

为什么会这样?

2 个答案:

答案 0 :(得分:199)

因为这就是架构师想要找到(id)的方式,如RDoc中所示:

  

按id查找 - 这可以是特定的id(1),id列表(1,5,6),也可以是id数组([5,6,10])。如果找不到所有列出的ID的记录,则会引发RecordNotFound。

如果您不想引发异常,请使用find_by_id,如果找不到具有指定id的对象,则返回nil。那么您的示例就是User.find_by_id(1)

答案 1 :(得分:-4)

除了runako的解释之外,选择是否引发异常实际上非常有用。我正在开发一个博客应用程序,我想添加对查看下一个或上一个博客条目的支持。我能够在我的Post模型中添加两​​个实例方法,当您在查看第一篇文章时尝试获取上一篇文章时返回nil,或者在查看最后一篇文章时查看下一篇文章:

def next
  Post.find_by_id(id + 1)
end

def previous
  Post.find_by_id(id - 1)
end

这可以避免我的帮助程序代码有条件地生成Previous Post / Next Post链接,因为它必须处理RecordNotFound异常,这会很糟糕,因为它会使用控制流的异常。