Ruby Sinatra - Fügen Sie benutzerdefinierte Routen für Dateien in öffentlichen Ordnern hinzu
Frage
Ich habe eine Sinatra -App, die von verschiedenen Kunden verwendet wird. Ich möchte dem Firmenlogo des Kunden und einem benutzerdefinierten Layout für jeden Kunden zeigen.
Die Codebasis ist im Wesentlichen für alle gleich. Alles, was ich brauche, ist eine Möglichkeit, einen anderen Satz von Dateien im Verzeichnis "öffentlich" und "layout.erb" einfach zu verwalten. Kopieren Sie bei der Bereitstellung auf dem Remote -Server automatisch nur die Dateien des jeweiligen Clients.
Lösung
Ein möglicher Weg wäre, eine zu haben view
und public
Verzeichnis pro Client und das richtige festlegen :views
und :public
Optionen für jede Anfrage
get '/:client/...' do
set :views, File.dirname(__FILE__) + "/views/#{params[:client]}"
set :public, File.dirname(__FILE__) + "/public/#{params[:client]}"
# Your code
end
Basierend auf Kommentar bearbeiten:
Stellen Sie Ihren öffentlichen Ordner während der config
Block. Fügen Sie nun einen Unterordner zu Ihrem öffentlichen Ordner für jeden Kunden hinzu. Alles, was Sie tun müssen, um auf die bestimmte Datei zuzugreifen, ist, Ihre Ansicht zu ändern, um zu erhalten /#{params[:client]}/logo.png
Anstatt von /logo.png
Andere Tipps
Ich habe gerade einen Weg gefunden, dieses Problem zu lösen. Es ist möglich, Routen zu Dateien in öffentlichen Ordnern neu zu definieren. Tatsächlich prüft Sinatra zunächst, ob eine Anforderung "GET" über eine entsprechende Route verfügt, und wenn dies nicht der Fall ist, geht es zum "öffentlichen" Ordner für statische Inhalte. Für jede clientspezifische Datei, die ich benötige, verwende ich einen spezifischen Pfad wie '/client/logo.gif' eine Art von URL. Ich habe eine Route für solche Dateien erstellt und meine benutzerdefinierte Logik dort angewendet:
get '/client/logo.gif' do
#custom logic..
redirect "#{where_client_files_are}/logo.gif"
end
Sie können Ihren folgenden Code zu Ihrem hinzufügen Ruby/Sinatra Datei
Beispiel: Bilder erstellen. Stil- und Skriptverzeichnis unter Ihrem Projekt und unterhalb des Code
get '/project1/images/:file' do
send_file('/home/sulo/dev/project1/images/'+params[:file], :disposition => 'inline')
end
get '/project1/style/:file' do
send_file('/home/sulo/dev/project1/style/'+params[:file], :disposition => 'inline')
end
get '/project1/scripts/:file' do
send_file('/home/sulo/dev/project1/scripts/'+params[:file], :disposition => 'inline')
end