Sinatra のデフォルトの NotFound エラー ページをオーバーライドする
概要
sinatra のデフォルトの NotFound エラー ページ (「Sinatra doesn’t know this ditty」) をオーバーライドする方法はありますか? 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 ブロックはエラー メッセージをオーバーライドします。
解決策
おそらく、受け入れられた回答で提案されているものよりも優雅な解決策は、error(404) スタイルや not_found スタイルを使用するのではなく、Sinatra::NotFound のみをレスキューすることです。
error Sinatra::NotFound do
content_type 'text/plain'
[404, 'Not Found']
end
これにより、定義していないルートに対して「sinatra doesn’t know this ditty」というデフォルト ページが表示されるのを防ぎますが、明示的な [404, ‘Something else’] スタイルの応答を返すことは妨げられません。