覆盖Sinatra默认的NotFound错误页面

有没有办法覆盖sinatra默认的NotFound错误页面(“Sinatra不知道这个小曲”)? 我希望sinatra只显示一个普通的字符串作为“找不到方法”,当它找不到正确的路由时,但是当我从路由中引发404错误时,我希望它显示传入的错误消息。

像这样实现not_found块:

not_found do 'Method not found.' end 

工作,但它不是一个有效的选项,因为我希望能够从这样的路由抛出我自己的NotFound错误消息:

  get '/' do begin # some processing that can raise an exception if resource not found rescue => e error 404, e.message.to_json end end 

但正如预期的那样not_found块会覆盖我的错误消息。

也许比在接受的答案中提出的更优雅的解决方案是仅拯救Sinatra::NotFound ,而不是使用error(404)not_found样式。

 error Sinatra::NotFound do content_type 'text/plain' [404, 'Not Found'] end 

这可以防止“sinatra不知道这个小曲”的默认页面用于您尚未定义的路线,但不会妨碍显式return [404, 'Something else']式响应。

如果您没有在路线中使用error handling,您可以使用这样的内置error路线(从Sinatra:Up and Running书中获取和修改)

 require 'sinatra' configure do set :show_exceptions, false end get '/div_by_zero' do 0 / 0 "You won't see me." end not_found do request.path end error do "Error is: " + params['captures'].first.inspect end 

有一个参数captures可以保存您的错误。 您可以通过params['captures']访问它。 它是一个数组,在我的测试中它将包含一个单独的元素,它本身就是错误(不是字符串)。

以下是有关请求对象的信息。

没关系,发现所有路线都按顺序匹配,所以在我把所有路线都放到get/post/put/delete '*' do ; end get/post/put/delete '*' do ; end ,这解决了我的问题。