Is there a way to override the sinatra default NotFound error page ("Sinatra doesnt know this ditty")? I want sinatra to show only a plain string as "Method not found" when it does not found the proper route, but when I raise an 404 error from inside a route I want it to show the passed-in error message.
Implementing the not_found block like this:
not_found do
'Method not found.'
end
works, but its not a valid option since I want to be able to throw my own NotFound error messages from routes like this:
get '/' do
begin
# some processing that can raise an exception if resource not found
rescue => e
error 404, e.message.to_json
end
end
But as expected not_found block overrides my error message.
Perhaps a more graceful solution than that proposed in the accepted answer is to rescue only
Sinatra::NotFound
, rather than using theerror(404)
ornot_found
styles.This prevents the "sinatra doesn't know this ditty" default page for routes that you haven't defined, but doesn't get in the way of explicit
return [404, 'Something else']
-style responses.If you don't use error handling in your route, you can utilize the built in
error
route like this (taken and modified from the Sinatra: Up and Running book)There is a parameter
captures
that holds your error. You can access it viaparams['captures']
. It is an array, and in my tests it would contain a single element, which was the error itself (not a string).Here is information on the request object.
Nevermind, found that all routes are matched in order, so after all routes I put
get/post/put/delete '*' do ; end
and that solves my problem.