Переопределить страницу ошибки NotFound по умолчанию Sinatra

Есть ли способ переопределить страницу с ошибкой по умолчанию Notat (по умолчанию "Sinatra does not know this ditty" )? Я хочу, чтобы синатра отображала только обычную строку, поскольку "Метод не найден", когда он не нашел правильный маршрут, но когда я поднимаю ошибку 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 блокирует переопределение моего сообщения об ошибке.

Ответ 1

Nevermind, обнаружил, что все маршруты сопоставляются по порядку, поэтому после всех маршрутов я помещаю get/post/put/delete '*' do ; end и это решает мою проблему.

Ответ 2

Возможно, более грациозным решением, чем предлагаемое в принятом ответе, является спасение только Sinatra::NotFound, а не использование стилей error(404) или not_found.

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

Это препятствует тому, чтобы страница по умолчанию "синатра не знала эту мелочь" для маршрутов, которые вы не определили, но не мешает явным ответам return [404, 'Something else'].

Ответ 3

Если вы не используете обработку ошибок на своем маршруте, вы можете использовать встроенный маршрут error, подобный этому (взятый и измененный из Sinatra: Вверх и Запуск)

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']. Это массив, и в моих тестах он содержал бы один элемент, который был самой ошибкой (а не строкой).

Вот информация о объекте запроса.