2009-06-22 1 views
2

Lassen Sie uns sagen, dass ich ein Bild, das in der normalen Position befindet sich nicht:Wie wird Rails für den Zugriff auf eine Medienressource konfiguriert, die sich nicht an ihrem herkömmlichen Speicherort befindet?

{appname}/public/images/unconventional.gif 

Aber statt hier:

{appname}/unconventional.gif 

ich dies verstehen eine vollständige Verletzung von Rails Konventionen, ist unmoralisch und Sie sollte dies unter keinen Umständen tun, und warum sollte ich überhaupt so eine dumme Sache vorschlagen?

Ok, jetzt haben wir das aus dem Weg, vorausgesetzt, ich bin auf Windows und daher symbolische Verbindungen sind nicht in Frage, wie ist es möglich, dies einzurichten?

Antwort

6

Rails liefert diese Bilder nicht, es lässt den Webserver das tun. Sie sollten die Konfiguration Ihres Webservers ändern, um dieses Szenario zu bewältigen. Wenn Sie zum Beispiel Apache verwenden, wäre es relativ einfach, mit mod_rewrite einzurichten.

machen 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 erstellen Sie einen 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 

Warnung:, wenn Sie das obige Konzept verwenden, beachten Sie, dass, wenn Sie Eingabe von der URL verwenden, die Datei zu entscheiden, zu dienen (mit params[:file], zum Beispiel), müssen Sie gründlich den Eingang bereinigen, weil Sie riskieren, Ihr gesamtes Dateisystem der Außenwelt auszusetzen.

Verwandte Themen