【问题标题】:Sinatra - Why does 404 error block never trigger?Sinatra - 为什么 404 错误块永远不会触发?
【发布时间】:2014-09-15 10:50:15
【问题描述】:

这是一个简单的应用程序:

class App < Sinatra::Base
    set :show_exceptions, false

    not_found do
       slim :err_404
    end

    post "/doit" do
        user ||= User.find(params["userid"]) || halt(404)
    end
end

当给定的用户 ID 无效时,应触发 404 错误块,然后呈现 404 页面。相反,Sinatra 在页面上显示“Internal Server Error”,并且此堆栈跟踪打印到控制台:

Problem:
  Document(s) not found for class User with id(s) 53d06a8ca7b7d52d11300003.
Summary:
       ....

我猜halt(404) 没有被调用。我关注了这个blog post about error handling,那么为什么同样的事情在这里不起作用?

【问题讨论】:

    标签: ruby exception-handling error-handling sinatra


    【解决方案1】:

    假设您正在使用 ActiveRecord,如果没有匹配的记录,User.find(params["userid"]) 将引发 ActiveRecord::RecordNotFound 异常。在 404 处理程序开始运行并结束路由处理之前引发此异常,从而导致内部服务器错误。

    要修复它,您可以检查异常,如果引发异常,则调用 404 处理程序:

    post "/doit" do
      begin
        user ||= User.find(params["userid"]
      rescue ActiveRecord::RecordNotFound
        halt(404)
      end
    end
    

    更好的解决方案可能是改用find_by_id,这样可以避免使用异常进行流控制:

    post "/doit" do
        user ||= User.find_by_id(params["userid"]) || halt(404)
    end
    

    【讨论】:

      猜你喜欢
      • 2016-02-10
      • 1970-01-01
      • 2018-10-26
      • 1970-01-01
      • 2014-05-15
      • 1970-01-01
      • 1970-01-01
      • 2014-08-18
      • 1970-01-01
      相关资源
      最近更新 更多