我正在尝试建立一个系统,用户只能看到他或她写的文章。
在文章控制器中,我放在行下面
@article = current_user.articles.find(params[:id])
其中params [:id]是article_id。
我只想知道如何跳过显示的错误,如果文章不存在,或者如果用户没有查看权限,只需重定向到:index操作。 我把@ article.nil?上面的find语句之后的条件语句,但似乎上面的find语句会立即产生错误,如下所示。
无法找到ID = 1662的文章[WHERE(articles
。user_id = 1)]
如何解决此问题?
答案 0 :(得分:22)
ActiveRecord :: Base.find如果找不到记录则总是抛出异常,这是故意的。如果你绝对希望拥有你正在寻找的任何东西,你应该只使用find
。如果您要渲染show动作并且找不到该文章,则应该挽救该异常并呈现404(未找到)而不是重定向到索引(技术上)。
如果您希望在不强制异常的情况下通过id
属性查找内容,请使用动态查找程序find_by_id
,如果找不到具有该ID的记录,则会返回false。
修改强>
动态查找程序现在有不同的签名,find_by_id
现在应该是:
find_by :id, id_to_find
答案 1 :(得分:4)
您应该使用find_by_id
或此question中提供的任何方法。
答案 2 :(得分:2)
这是因为ActiveRecord find方法在找不到特定ID时会引发异常。你可以通过几种方式解决这个问题,最好的方法似乎是
begin
@article = current_user.articles.find(params[:id])
rescue
redirect_to articles_path
end
答案 3 :(得分:1)
find()方法引发RecordNotFound异常,而find_by_id等方法将返回nil值。所以你有几个选项可以用开始/救援包装方法调用,将rescue_from块添加到你的控制器:
rescue_from(ActiveRecord::RecordNotFound) {|e| do something here }
或使用find_by_id方法并处理返回nil的条件。
实际上还有很多其他选择,但上面的选择是一个好的开始,find_by_id可能是最简单的。