Servir des fichiers statiques avec Sinatra

J’ai un site Web d’une seule page utilisant uniquement HTML, CSS et JavaScript. Je veux déployer l’application sur Heroku, mais je ne peux pas trouver un moyen de le faire. J’essaie maintenant de faire en sorte que l’application fonctionne avec Sinatra.

. |-- application.css |-- application.js |-- index.html |-- jquery.js `-- myapp.rb 

Et ce qui suit est le contenu de myapp.rb .

 require 'rubygems' require 'sinatra' get "/" do # What should I write here to point to the `index.html` end 

Sans aucune configuration supplémentaire, Sinatra servira les actifs en public . Pour l’itinéraire vide, vous souhaitez rendre le document d’index.

 require 'rubygems' require 'sinatra' get '/' do File.read(File.join('public', 'index.html')) end 

Les routes doivent renvoyer une Ssortingng qui devient le corps de réponse HTTP. File.read ouvre un fichier, lit le fichier, ferme le fichier et renvoie une Ssortingng .

Vous pouvez utiliser l’assistant send_file pour servir des fichiers.

 require 'sinatra' get '/' do send_file File.join(settings.public_folder, 'index.html') end 

Cela servira le index.html de tout répertoire configuré avec les fichiers statiques de votre application.

Vous pouvez simplement les héberger à partir du dossier public et ils n’ont pas besoin d’itinéraires.

 . -- myapp.rb `-- public |-- application.css |-- application.js |-- index.html `-- jquery.js 

Dans le myapp.rb

 set :public_folder, 'public' get "/" do redirect '/index.html' end 

Lien vers un sous-dossier en public

 set :public_folder, 'public' get "/" do redirect '/subfolder/index.html' end 

Tout dans ./public est accessible depuis ‘/whatever/bla.html

Exemple :
./public/stylesheets/screen.css
Sera accessible via ‘/stylesheets/screen.css’ aucun itinéraire requirejs

Gardez à l’esprit qu’en production, votre serveur Web peut envoyer index.html automatiquement afin que la requête ne parvienne jamais à Sinatra. C’est mieux pour les performances car vous n’avez pas à passer par la stack Sinatra / Rack juste pour servir du texte statique, ce que Apache / Nginx est génial à faire.

Sinatra devrait vous permettre de servir des fichiers statiques à partir du répertoire public, comme expliqué dans la documentation :

Fichiers statiques

Les fichiers statiques sont servis à partir du répertoire ./public. Vous pouvez spécifier un autre emplacement en définissant l’option: public:

Notez que le nom du répertoire public n’est pas inclus dans l’URL. Un fichier ./public/css/style.css est disponible sous le nom example.com/css/style.css.

Le bijou sinatra-assetpack offre toute une série de fonctionnalités. la syntaxe est douce:

 serve '/js', from: '/app/javascripts' 

Bien que j’aie encore des problèmes avec le pipeline de ressources de rails, j’ai l’impression que j’ai beaucoup plus de contrôle en utilisant sinatra-assetpack – mais la plupart du temps, cela ne fonctionne qu’avec quelques lignes de code.

RÉPONSE MISE À JOUR : J’ai lié tout ce qui précède sans avoir la chance d’être chargé de charger des contenus css, js …. etc la seule chose qui se chargeait était index.html … et le rest allait = >> 404 error

Ma solution: le dossier de l’application ressemble à ceci.

index.rb == >> Le code Sinatra va.

 require 'rubygems' require 'sinatra' get '/' do html :index end def html(view) File.read(File.join('public', "#{view.to_s}.html")) end 

public folder == >> contient tout le rest … css, js, blah blah..etc.

 user@user-SVE1411EGXB:~/sintra1$ ls index.rb public user@user-SVE1411EGXB:~/sintra1$ find public/ public/ public/index.html public/about_us.html public/contact.html public/fonts public/fonts/fontawesome-webfont.svg public/fonts/fontawesome-webfont.ttf public/img public/img/drink_ZIDO.jpg public/js public/js/bootstrap.min.js public/js/jquery.min.js public/js/bootstrap.js public/carsoul2.html public/css public/css/font-awesome-ie7.css public/css/bootstrap.min.css public/css/font-awesome.min.css public/css/bootstrap.css public/css/font-awesome.css public/css/style.css user@user-SVE1411EGXB:~/sintra1$ 

Maintenant, démarrez le serveur et vous pourrez naviguer dans les pages statiques sans aucun problème.

 user@user-SVE1411EGXB:~/sintra1$ ruby index.rb == Sinatra/1.4.5 has taken the stage on 4567 for development with backup from Thin >> Thin web server (v1.5.1 codename Straight Razor) >> Maximum connections set to 1024 >> Listening on localhost:4567, CTRL+C to stop 

Ajouter la ligne ci-dessous dans le fichier rb principal

 set :public_folder, 'public' 
 require 'rubygems' require 'sinatra' set :public_folder, File.dirname(__FILE__) + '/../client' #client - it's folder with all your file, including myapp.rb get "/" do File.read('index.html') end 

Vous pouvez envisager de déplacer le fichier index.html vers views/index.erb et définir un noeud final tel que:

 get '/' do erb :index end 

La mise des fichiers dans public dossier public est limitée. En fait, lorsque vous êtes dans la racine '/' chemin '/' access fonctionne correctement car le navigateur définit le chemin relatif de votre fichier css, par exemple /css/style.css et sinatra recherche le fichier dans le répertoire public . Cependant, si votre emplacement est par exemple /user/create , le navigateur Web recherchera votre fichier css dans /user/create/css/style.css et échouera.

Pour contourner ce problème, j’ai ajouté la redirection suivante pour charger correctement le fichier css:

 get %r{.*/css/style.css} do redirect('css/style.css') end 

http://sinatrarb.com/configuration.html#static—enabledisable-static-file-routes

Ce serait la bonne façon de le faire.

 set :public_folder, 'public' 

J’ai utilisé le paramètre statique car il peut affecter l’utilisation de public_folder.

Qu’en est-il de cette solution? :

 get "/subdirectory/:file" do file = params[:file] + "index.html" if File.exists?(params[:file]) return File.open("subdirectory/" + file) else return "error" end end 

donc si vous naviguez maintenant vers (par exemple) / sous-répertoire / test / il chargera le sous-répertoire / test / index.html