Quando si instradano le risorse in Rails, l'attributo di formato opzionale viene automaticamente aggiunto ai percorsi generati. Questo è così che la risorsa in questione può essere richiesta come XML, HTML, ecc. I formati effettivamente permessi sono solitamente descritti nel controller usando respond_to
.Come limitare i formati di risorse nel file di percorsi di Rails
Ma in molti casi si desidera supportare solo HTML e sembra un sovraccarico scrivere respond_to :html
in ogni azione in ogni controller. Sarebbe quindi bello se esistesse un modo per limitare i tipi di contenuto consentiti già durante la creazione delle rotte nel file routes.rb, ad es.
map.resources :users, :formats => :html
map.resources :users, :formats => [:html, :xml]
map.resources :users, :formats => {:index => :html, :show => [:html, :xml]}
C'è un modo per raggiungere questo obiettivo sia nativo o tramite un plug-in?
P.S. Il solito modo di aggirare questo problema è ignorare il problema e non utilizzare respond_to
nelle azioni. Ma questo in realtà non limita i tipi di contenuti consentiti. Invece si aspetta solo che esista un modello nella directory views per ogni possibile tipo di contenuto. Se uno non esiste quando richiesto, il sistema genererà un errore HTTP 500.
No, significa 500 errore di qualcosa è andato storto sul server . Se un tipo di contenuto non è supportato non è un errore del server - si tratta di un errore del client (il client non avrebbe dovuto richiederlo). Un 406 sarebbe il codice di risposta corretto. Vedere "Codici di risposta HTTP": http://www.sitepoint.com/blogs/2008/02/04/restful-rails-part-i/ –
Sicuramente se si intende tagare .xml o .html alla fine di l'URL e quel formato non sono supportati, quindi si dovrebbe restituire 404 non trovato. Sembra quasi impertinente ignorare l'uso di conneg creando URL per ogni tipo di contenuto, ma poi rubare il codice di risposta per quando non c'è un tipo di contenuto valido nell'intestazione accept! –
Beh, potresti avere un punto - anche se questo è in realtà il modo in cui Rails funziona fuori dagli schemi. Ma tuttavia questo non è il punto della mia domanda. Vorrei comunque specificare questo in una posizione centrale (preferibilmente il file di percorsi), non importa se poi un 404 o un 406 viene restituito per errore –