Come si configurano Rails per accedere a una risorsa multimediale che non si trova nella sua posizione di directory convenzionale?
-
06-07-2019 - |
Domanda
Diciamo che ho un'immagine che non risiede nella posizione normale:
{appname}/public/images/unconventional.gif
Ma invece qui:
{appname}/unconventional.gif
Comprendo che si tratta di una violazione totale delle convenzioni di Rails, è immorale e non dovresti mai farlo in nessuna circostanza e, inoltre, perché dovrei anche suggerire una cosa così sciocca?
Ok, ora che lo abbiamo rimosso, supponendo che io sia su Windows e quindi i collegamenti simbolici sono fuori questione, come è possibile configurarlo?
Soluzione
Rails non fornisce queste immagini, ma consente al web server di farlo. È meglio modificare la configurazione del server Web per gestire questo scenario. Se usi Apache
, ad esempio, sarebbe abbastanza facile configurarlo con mod_rewrite
.
Fare in modo che Rails serva queste immagini sarà brutto, ma è possibile se fornisci un percorso nel tuo route.rb
che corrisponde a / public / images / unconventional.gif
e se il file stesso non esiste. Ad esempio:
map.connect "public/images/unconventional.gif",
:controller => "static_image_controller",
:action => "serve"
E quindi creare un controller StaticImageController
:
class StaticImageController < ApplicationController
def serve
image = File.read(File.join(Rails.root, "unconventional.gif"))
send_data image, :type => "image/gif", :disposition => "inline"
end
end
Avviso: se si utilizza il concetto sopra riportato, tenere presente che se si utilizza l'input dall'URL per decidere quale file pubblicare (con params [: file]
, per esempio), è necessario eliminare completamente l'input, poiché si rischia di esporre l'intero file system al mondo esterno.