【问题标题】:How can I skip an error if find returns nothing in rails?如果 find 在 rails 中没有返回任何内容,我该如何跳过错误?
【发布时间】:2011-03-24 02:59:48
【问题描述】:

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

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

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

其中 params[:id] 是 article_id。

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

找不到 ID=1662 的文章 [WHERE (articles.user_id = 1)]

我该如何解决这个问题?

【问题讨论】:

标签: ruby-on-rails


【解决方案1】:

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

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

编辑:

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

find_by :id, id_to_find

查看新的Rails Guide on Querying

【讨论】:

  • 我建议改用find_by
  • find_by 在被问到这个问题时不存在。不过,我确实添加了指向指南和动态查找器部分的链接。
【解决方案2】:

您应该使用find_by_id 或此question 中给出的任何方法。

【讨论】:

    【解决方案3】:

    find() 方法引发 RecordNotFound 异常,而 find_by_id 等方法将返回 nil 值。所以你有几个选项可以用 begin/rescue 包装你的方法调用,添加一个 rescue_from 块到你的控制器:

    rescue_from(ActiveRecord::RecordNotFound) {|e| do something here }
    

    或使用 find_by_id 方法并处理返回 nil 的条件。

    实际上还有很多其他的选择,但上面的选择是一个好的开始,find_by_id 可能是最简单的。

    【讨论】:

      【解决方案4】:

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

      begin
        @article = current_user.articles.find(params[:id])
      rescue
        redirect_to articles_path
      end
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-11-18
        • 1970-01-01
        • 1970-01-01
        • 2020-09-14
        相关资源
        最近更新 更多