Ruby on rails 如果find在rails中不返回任何内容,我如何跳过错误?

Ruby on rails 如果find在rails中不返回任何内容,我如何跳过错误?,ruby-on-rails,Ruby On Rails,我试图建立一个系统,用户只能看到他或她写的文章 在文章控制器中,我在下面一行 @article = current_user.articles.find(params[:id]) 其中params[:id]是一个项目id 我只是想知道,如果文章不存在,或者如果用户没有查看该文章的权限,如何从显示中跳过错误并重定向到:index操作。 我放@article.nil?上面的find语句之后的条件语句,但上面的find语句似乎会立即产生如下错误 找不到ID=1662的文章[其中articles.us

我试图建立一个系统,用户只能看到他或她写的文章

在文章控制器中,我在下面一行

@article = current_user.articles.find(params[:id])
其中params[:id]是一个项目id

我只是想知道,如果文章不存在,或者如果用户没有查看该文章的权限,如何从显示中跳过错误并重定向到:index操作。 我放@article.nil?上面的find语句之后的条件语句,但上面的find语句似乎会立即产生如下错误

找不到ID=1662的文章[其中articles.user\u ID=1]


如何解决此问题?

ActiveRecord::Base.find始终会引发异常。如果它找不到记录,这是故意的。只有当你绝对希望得到你想要的东西时,你才应该使用find。如果您正在渲染一个show action,但找不到该文章,您应该修复该异常并渲染一个404 Not found,而不是重定向到索引

如果您想通过id属性查找某个内容而不强制执行异常,请使用动态查找器find_by_id,如果找不到具有该id的记录,它将返回false

编辑:

动态查找程序现在具有不同的签名,按查找id查找现在应为:

查找人:id,要查找的id


请参阅新的

find方法引发RecordNotFound异常,而find_by_id等方法将返回nil值。因此,您有两个选项,可以将方法调用包装为begin/rescue,将rescue_from块添加到控制器:

rescue_from(ActiveRecord::RecordNotFound) {|e| do something here }
或者使用find_by_id方法并处理返回nil的条件


实际上还有很多其他的替代方法,但上面的方法是一个很好的开始,按id查找可能是最简单的方法。

您应该使用按id查找或本文中给出的任何方法。

这是因为ActiveRecord find方法在找不到特定id时会引发异常。您可以通过几种方法解决这个问题,最好的办法似乎是

begin
  @article = current_user.articles.find(params[:id])
rescue
  redirect_to articles_path
end
与此相关,我建议使用find_by,而不是在提出此问题时,find_by不存在。不过,我确实添加了一个指向指南和动态查找器部分的链接。