2013-11-05 19 views
10

Ho una app sinatra di base che esegue il rendering dei file da una directory. Quello che mi piacerebbe è restituisce 404 se la pagina non esiste. Attualmente genera 500 errori.Rendering 404 in sinatra se il file non viene trovato

get '/:page' do 
    erb :"pages/#{params[:page]}", layout: :"layouts/application" 
end 

risposta

1

Si potrebbe fare qualcosa di simile:

get '/:page' do 
    requested_erb = File.join(root, 'pages', params[:page]) 

    pass unless File.exists?(requested_erb) 

    erb :"#{requested_erb}", :layout: :"layouts/application" 
end 

non ho ancora testato questo, quindi ci potrebbero essere alcuni problemi con il codice di cui sopra, ma questa è l'idea generale nella mia testa.

+0

Sfortunatamente tutte le pagine ora sollevano 404 – olimart

+0

Controlla per vedere cosa restituisce 'requested_erb = File.join (root, 'pages', params [: page]) - questo potrebbe non essere corretto al 100%. – CDub

17

Prova questo;)

# 404 Error! 
not_found do 
    status 404 
    erb :oops 
end 

farsi una pagina 404, con qualsiasi nome che ti piace (il mio è oops.erb, per esempio), e questo dovrebbe funzionare bene.

not_found è Sinatra's helper di gestione degli errori per l'acquisizione di errori 500 e 404 non-found che restituisce. È quindi possibile modificare lo stato HTTP e la vista corrispondente utilizzandolo. Check out the documentation per tutti gli errori di gestore di Sinatra: sono super utili!

+3

Inoltre, [controlla l'interruzione di Sinatra] (http://myronmars.to/n/dev-blog/2012/01/why-sinatras-halt-is-awesome). –

+3

Se si utilizza 'halt (404)' come suggerito da Jordan, 'not_found' verrà chiamato automaticamente (e non è nemmeno necessario specificare la direttiva' status'). – Alessandro

+2

Tuttavia, si noti che, secondo la mia esperienza, contrariamente a quanto suggerisce la risposta originale, "not_found" rileva solo 404. Non sarà invocato per 500 o anche altri errori nella classe 4xx. – Alessandro

Problemi correlati