Переопределить страницу ошибки NotFound по умолчанию в Sinatra - PullRequest
10 голосов
/ 10 декабря 2011

Есть ли способ переопределить страницу ошибки NotFound по умолчанию для sinatra («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 отменяет мое сообщение об ошибке.

Ответы [ 3 ]

15 голосов
/ 16 октября 2013

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

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

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

5 голосов
/ 10 декабря 2011

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

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

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

0 голосов
/ 12 декабря 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...