Wie Schienen werden konfiguriert, um eine Medien-Ressource zuzugreifen, die nicht in seiner herkömmlichen Verzeichnisposition ist?
-
06-07-2019 - |
Frage
Lassen Sie uns sagen, dass ich ein Bild, das in der normalen Position befindet sich nicht:
{appname}/public/images/unconventional.gif
Doch statt sich hier:
{appname}/unconventional.gif
Ich verstehe dies eine komplette Verletzung der Rails Konventionen ist, ist unmoralisch und Sie sollten diese unter keinen Umständen tun und darüber hinaus, warum würde ich vorschlagen, auch eine so dumme Sache?
Ok, jetzt, wo wir haben, dass ich unter Windows aus dem Weg, unter der Annahme, und deshalb symbolische Links sind aus der Frage, wie ist es möglich, dies einzurichten?
Lösung
Schienen dient nicht diese Bilder, es lässt den Web-Server tun. Sie hatten am besten die Konfiguration Ihres Web-Server ändern, um dieses Szenario zu behandeln. Wenn Sie Apache
verwenden, zum Beispiel, wäre es ziemlich einfach, mit mod_rewrite
einzurichten.
Herstellung Rails dienen diese Bilder hässlich sein, aber es ist möglich, wenn Sie eine Route in Ihrem routes.rb
bereitzustellen, die /public/images/unconventional.gif
übereinstimmt, und wenn die Datei selbst nicht existiert. Zum Beispiel:
map.connect "public/images/unconventional.gif",
:controller => "static_image_controller",
:action => "serve"
Und dann einen Controller StaticImageController
erstellen:
class StaticImageController < ApplicationController
def serve
image = File.read(File.join(Rails.root, "unconventional.gif"))
send_data image, :type => "image/gif", :disposition => "inline"
end
end
Achtung: , wenn Sie das obige Konzept verwenden, beachten Sie, dass, wenn Sie Eingabe von der URL verwenden, die Datei zu dienen (mit params[:file]
, zum Beispiel), um zu entscheiden, müssen Sie gründlich sterilisieren Sie die Eingabe, weil Sie Ihr gesamtes Dateisystem zur Außenwelt riskieren ausgesetzt wird.