Ruby Sinatra-为什么404错误块从不触发?

Ruby Sinatra-为什么404错误块从不触发?,ruby,exception-handling,error-handling,sinatra,Ruby,Exception Handling,Error Handling,Sinatra,以下是一个简单的应用程序: 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 我猜没有调用halt(404)。我一直在关注这一点,那么为什么同样的事情

以下是一个简单的应用程序:

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

我猜没有调用
halt(404)
。我一直在关注这一点,那么为什么同样的事情在这里不起作用呢?

假设您使用的是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
post "/doit" do
    user ||= User.find_by_id(params["userid"]) || halt(404)
end