Techioz Blog

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’] スタイルの応答を返すことは妨げられません。