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

可能的复制品:
Find (1)在 id 1不存在时给出 ActiveRecord 错误

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

为什么会这样?

71521 次浏览

因为这是架构师打算找到(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)

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

def next
Post.find_by_id(id + 1)
end


def previous
Post.find_by_id(id - 1)
end

这样可以避免帮助程序代码有条件地生成上一个 Post/Next Post 链接,从而避免必须处理 RecordNotFound异常,这样做会很糟糕,因为它将使用控制流异常。