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

Kir*_*ein 116 activerecord ruby-on-rails

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

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

为什么是这样?

run*_*ako 208

因为这是架构师想要找到(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).

  • 我认为引发错误的原因是基本控制器可以捕获它并显示显示404页面.如果你点击/ widgets/2并且没有id == 2的小部件,那么你得到一个404,这是IMO有意义的. (43认同)
  • @Nick`find_by_id(1)`确实被弃用了.但你可以使用`find_by(id:1)`. (6认同)
  • 这仍然无法解释为什么它是默认行为,在ActiveRecord的大多数其他部分中,默认行为是为失败返回nil或false,并将异常控制流留给以bang结尾的方法(#save!). (4认同)
  • RecordNotFound被引发,而不是返回.这允许调用者的控制流程不同,因为您不必检查返回值是否为nil(您将使用开始/救援块). (3认同)
  • 如何避免异常的解释是有用的,但这里没有任何内容实际上回答了为什么它是这样的问题.换句话说,"因为制作它的人想要那样"并不是一个有用的答案,也不是"文档说它就是这样". (2认同)