Rails:为什么find(id)在rails中引发exception?

可能重复:
当id 1不存在时,Model.find(1)给出ActiveRecord错误

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

为什么是这样?

因为这是build筑师想要find(id)工作的方式,正如RDoc所示:

通过id查找 – 这可以是特定的id(1),id列表(1,5,6)或id数组([5,6,10])。 如果没有logging可以find所有列出的ID,那么RecordNotFound将被提出。

如果您不想引发exception,请使用find_by_id,如果找不到具有指定id的对象,将返回nil。 你的例子将是User.find_by_id(1)

除了runako的解释之外,select是否引发exception确实非常有用。 我正在开发一个博客应用程序,我想增加对查看下一个或上一个博客条目的支持。 我可以添加两个实例方法到我的Post模型,当您尝试在查看第一篇文章时获取上一篇文章或在查看最后一篇文章时的下一篇文章时,返回nil

 def next Post.find_by_id(id + 1) end def previous Post.find_by_id(id - 1) end 

这样可以避免我的帮助程序代码有条件地生成Previous Post / Next Post链接,从而不必处理RecordNotFoundexception,这很不好,因为它将使用控制stream的exception。