Non ho aspettato più di qualche ora ad introdurre >respond_to() nell'applicazione Rails. Nel mio caso utilizzo un unico metodo per mostrare un'anteprima di una immagine. Se la richiesta è HTML mostro la cornice che impagina la thumbnail, in alternativa se la richiesta è di tipo immagine (png) restituisco l'immagine stessa. Per ogni altra richiesta restituisco 404.
A grandi linee, il codice assomiglia a questo:
def show # validate URI begin @uri = URI.parse('http://' + params[:uri]) rescue raise_404(); return end # more code here and get image_path respond_to do |type| # html request type.html { render } # default template # image requests type.png { send_file(image_path, :disposition => 'inline') } # all type.all { raise_404(); return } end end
Come potete notare, utilizzo send_file()
per inviare il contenuto del file e non fornisco direttamente il suo percorso per motivi di sicurezza. Questo approccio funziona però ad una condizione, ovvero che il controller che gestisce l'immagine — nel mio caso show — si trovi al di fuori di public/images
.
public/images
è infatti una cartella speciale il Rails. I file contenuti all'interno non sono soggetti a routing ma vengono direttamente restituiti al client.
Attenzione quindi. Se scriverete nel vostro file config/routes.rb una regola tipo
# display image map.image '/images/thubmnail/:uri', :controller => 'thumbnail', :action => 'show'
non verrà mai eseguita con una configurazione di Rails predefinita. O almeno, questo mi risulta al momento. L'accendiamo?