Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

Ruby Diary #26: Dove salvare le immagini in Rails

Attenzione a salvare le immagini nel posto giusto in Rails, il rischio è un comportamento inaspettato del programma.
Attenzione a salvare le immagini nel posto giusto in Rails, il rischio è un comportamento inaspettato del programma.
Link copiato negli appunti

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?

Ti consigliamo anche