2009-11-24 8 views
3

J'ai une application Sinatra qui serait utilisé par des clients différents. Je souhaite montrer le logo de l'entreprise du client et un layout.erb personnalisé pour chaque client.Ruby Sinatra - Ajouter des itinéraires personnalisés pour les fichiers dans des dossiers publics

La base de code est essentiellement la même pour tout le monde. Tout ce dont j'ai besoin est un moyen de conserver facilement un ensemble différent de fichiers dans le répertoire 'Public' et 'layout.erb', et lors du déploiement sur le serveur distant, de copier automatiquement uniquement les fichiers du client particulier.

Répondre

3

Une façon possible serait d'avoir un répertoire view et public par client et définir les :views et :public appropriés des options pour chaque demande

get '/:client/...' do 
    set :views, File.dirname(__FILE__) + "/views/#{params[:client]}" 
    set :public, File.dirname(__FILE__) + "/public/#{params[:client]}" 

    # Your code 
end 

Modifier basé sur le commentaire:

Définir votre dossier public pendant le bloc config. Maintenant, ajoutez un sous-dossier à votre dossier public pour chaque client. Tout ce que vous devez faire pour accéder au fichier spécifique est de modifier votre point de vue pour obtenir /#{params[:client]}/logo.png au lieu de /logo.png

+0

Yoann, je n'étais pas au courant de cette possibilité, merci! Je voudrais cependant ajouter plusieurs dossiers publics. Un ensemble de fichiers est commun à tous les clients, et seuls quelques-uns diffèrent. J'aimerais ajouter les deux aux routes. Des idées? Merci! – Jasim

+0

Vous pouvez définir un dossier public commun et dans certains sous-dossiers avec les fichiers spécifiques. Au lieu de changer les options publiques: chaque fois que vous demandez simplement le fichier dans le sous-dossier basé sur le client –

1

Juste trouvé un moyen de résoudre ce problème. Il est possible de redéfinir des routes vers des fichiers dans des dossiers publics. En fait, Sinatra vérifie d'abord si une requête 'get' a un chemin correspondant, et si ce n'est pas le cas, elle va dans le dossier 'public' pour le contenu statique. Donc, pour tout fichier spécifique au client dont j'ai besoin, j'utilise un chemin spécifique comme '/client/logo.gif' type d'URL. J'ai créé un itinéraire pour ces fichiers et appliqué ma logique personnalisée là:

get '/client/logo.gif' do 
    #custom logic.. 
    redirect "#{where_client_files_are}/logo.gif" 
end 
0

Vous pouvez ajouter ci-dessous le code à votre fichier ruby ​​/ sinatra

exemple: créer des images. style et répertoire de scripts sous votre projet et sous le 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