2011-12-09 6 views
10

Esiste un modo per sovrascrivere la pagina di errore NotFound predefinita di sinatra ("Sinatra non conosce questa canzoncina")? Voglio che sinatra mostri solo una stringa semplice come "Metodo non trovato" quando non trova il percorso corretto, ma quando sollevo un errore 404 dall'interno di una rotta voglio che mostri il messaggio di errore passato.Override Sinatra default NotFound error page

Attuazione del blocco not_found in questo modo:

not_found do 
    'Method not found.' 
    end 

opere, ma la sua non è un'opzione valida perché voglio essere in grado di lanciare i miei messaggi di errore NotFound dalle rotte come questo:

get '/' do 
    begin 
     # some processing that can raise an exception if resource not found 
    rescue => e 
     error 404, e.message.to_json 
    end 
    end 

Ma come previsto il blocco not_found sovrascrive il mio messaggio di errore.

risposta

0

Nevermind, ha scoperto che tutti i percorsi sono abbinati in ordine, così dopo tutte le rotte ho messo get/post/put/delete '*' do ; end e che risolve il mio problema.

5

Se non si utilizza la gestione degli errori nel vostro percorso, è possibile utilizzare il costruito nel error percorso come questo (preso e modificato dal libro Sinatra: Up and Running)

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 

C'è un parametro che tiene la vostra captures errore. È possibile accedervi tramite params['captures']. È un array e nei miei test dovrebbe contenere un singolo elemento, che era l'errore stesso (non una stringa).

Here is information on the request object.

+0

I, che funziona ma non per percorsi ineguagliati, quindi se ho un'applicazione sinatra come quella che hai postato e cerco di raggiungere per esempio '/ this_is_not_a_present_route' vedo ancora la pagina sinatra predefinita al posto del messaggio di errore. –

+1

Quindi, se hai una richiesta per un percorso inesistente, usa la route 'not_found'. Nell'oggetto richiesta, vi è 'request.path' che ti darà' 'this_is_not_a_present_route'' nel tuo esempio. Ho aggiornato anche l'esempio. –

+0

Ciao, il problema è come non ignorare gli altri 404 messaggi di errore generati da percorsi interni. In questo modo presenterà sempre request.path se provi a raggiungere una route non implementata, ma la mostrerà se viene generato un errore 404 dai percorsi interni. –

13

Forse una soluzione più elegante di quella proposta in the accepted answer è di salvare solo Sinatra::NotFound, invece di usare i error(404) o not_found stili.

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

questo modo si evita il "Sinatra non conosce questa canzoncina" pagina di default per le rotte che non sono stati definiti, ma non ottiene nel modo di esplicite return [404, 'Something else'] risposte -style.

Problemi correlati