gpt4 book ai didi

ruby - Sinatra-为什么404错误阻止永远不会触发?

转载 作者:行者123 更新时间:2023-12-03 07:50:21 25 4
gpt4 key购买 nike

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

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,那么为什么同一件事在这里不起作用?

最佳答案

假设您正在使用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

关于ruby - Sinatra-为什么404错误阻止永远不会触发?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24924276/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com