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
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
.
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.
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
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.
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.
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
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
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
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.
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'
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