如果find在rails中没有返回任何内容,我怎么能跳过错误?

时间:2011-03-24 02:59:49

标签: ruby-on-rails

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

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

@article = current_user.articles.find(params[:id])

其中params [:id]是article_id。

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

无法找到ID = 1662的文章[WHERE(articles。user_id = 1)]

如何解决此问题?

4 个答案:

答案 0 :(得分:22)

ActiveRecord :: Base.find如果找不到记录则总是抛出异常,这是故意的。如果你绝对希望拥有你正在寻找的任何东西,你应该只使用find。如果您要渲染show动作并且找不到该文章,则应该挽救该异常并呈现404(未找到)而不是重定向到索引(技术上)。

如果您希望在不强制异常的情况下通过id属性查找内容,请使用动态查找程序find_by_id,如果找不到具有该ID的记录,则会返回false。

修改

动态查找程序现在有不同的签名,find_by_id现在应该是:

find_by :id, id_to_find

查看新的Rails Guide on Querying

答案 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可能是最简单的。