覆盖Sinatra默认的NotFound错误页面

时间:2011-12-09 22:02:05

标签: ruby sinatra

有没有办法覆盖sinatra默认的NotFound错误页面(“Sinatra不知道这个小曲”)?我希望sinatra在找不到正确的路径时只显示一个普通的字符串“Method not found”,但是当我从路径中引发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阻止覆盖我的错误消息。

3 个答案:

答案 0 :(得分:15)

或许比the accepted answer中提出的解决方案更优雅的解决方案是仅展开Sinatra::NotFound,而不是使用error(404)not_found样式。

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

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

答案 1 :(得分:5)

如果您没有在路线中使用错误处理,则可以使用内置的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']访问它。它是一个数组,在我的测试中它将包含一个单独的元素,它本身就是错误(不是字符串)。

Here is information on the request object.

答案 2 :(得分:0)

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