web-dev-qa-db-fra.com

Servir des fichiers statiques avec Sinatra

J'ai un site Web d'une page utilisant uniquement HTML, CSS et JavaScript. Je souhaite déployer l'application sur Heroku, mais je ne trouve pas le moyen de le faire. J'essaie maintenant de faire fonctionner l'application 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
136
TK.

Sans configuration supplémentaire, Sinatra servira des actifs dans public. Pour la route vide, vous voudrez rendre le document d'index.

require 'rubygems'
require 'sinatra'

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

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

127
Tate Johnson

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 index.html à partir de n'importe quel répertoire configuré avec les fichiers statiques de votre application.

164
Ryan Ahearn

Vous pouvez simplement les héberger à partir du dossier public et ils n'ont pas besoin de routes.

.
-- 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 ce qui se trouve dans ./public est accessible à partir de '/w Whatever/bla.html

Exemple :
./public/stylesheets/screen.css
Sera accessible via '/stylesheets/screen.css' aucun itinéraire requis

61
Morgan

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 exemple.com/css/style.css.

N'oubliez pas qu'en production, votre serveur Web peut envoyer le index.html automatiquement afin que la demande ne parvienne jamais à Sinatra. C’est mieux pour la performance, car vous n’avez pas à passer par la pile Sinatra/Rack pour simplement servir du texte statique, ce qu’Apache/Nginx fait de super.

12
Rob Cameron

le sinatra-assetpack gem offre de nombreuses fonctionnalités. la syntaxe est douce:

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

alors que j'ai toujours des problèmes avec le pipeline d'actifs de Rails, j'ai l'impression que j'ai beaucoup plus de contrôle avec sinatra-assetpack - mais la plupart du temps, cela fonctionne simplement avec quelques lignes de code.

2
jitter
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
2
Evan Ross

Ajouter la ligne ci-dessous dans le fichier rb principal

set :public_folder, 'public'

RÉPONSE MISE À JOUR : J'ai lié tout ce qui précède sans chance de pouvoir charger les fichiers css, js, etc. = >> 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 reste ... 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 sans problème dans les pages statiques.

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
2
zee

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

get '/' do
  erb :index
end
1
bonh

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 static car il peut affecter l'utilisation de public_folder.

0
Hayden

Vous pouvez toujours utiliser Rack :: Static

https://www.rubydoc.info/gems/rack/Rack/Static

Ajoutez simplement cette ligne avant la commande 'run' dans 'config.ru'

use Rack::Static, :urls => [""], :root => 'public', :index => 'index.html'
0
r0ma

Mettre des fichiers dans le dossier public a une limite. En fait, lorsque vous êtes à la racine, le chemin '/' fonctionne correctement, car le navigateur définit le chemin relatif de votre fichier CSS, par exemple /css/style.css, et sinatra le recherche dans le répertoire public. Toutefois, 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 le 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
0
Charmi