Ответ 1
Nevermind, обнаружил, что все маршруты сопоставляются по порядку, поэтому после всех маршрутов я помещаю get/post/put/delete '*' do ; end
и это решает мою проблему.
Есть ли способ переопределить страницу с ошибкой по умолчанию 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 блокирует переопределение моего сообщения об ошибке.
Nevermind, обнаружил, что все маршруты сопоставляются по порядку, поэтому после всех маршрутов я помещаю get/post/put/delete '*' do ; end
и это решает мою проблему.
Возможно, более грациозным решением, чем предлагаемое в принятом ответе, является спасение только Sinatra::NotFound
, а не использование стилей error(404)
или not_found
.
error Sinatra::NotFound do
content_type 'text/plain'
[404, 'Not Found']
end
Это препятствует тому, чтобы страница по умолчанию "синатра не знала эту мелочь" для маршрутов, которые вы не определили, но не мешает явным ответам return [404, 'Something else']
.
Если вы не используете обработку ошибок на своем маршруте, вы можете использовать встроенный маршрут 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']
. Это массив, и в моих тестах он содержал бы один элемент, который был самой ошибкой (а не строкой).