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 de moyen de le faire. J'essaye 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
require 'webrick'; server = WEBrick::HTTPServer.new Port: 1234; server.mount '/', WEBrick::HTTPServlet::FileHandler, 'www/'; trap("INT") { server.stop }; server.start;
Alors courezruby myapp.rb
. Supprimez le port pour Heroku. Mettezweb: ruby myapp.rb
votreProcfile
. Le commentaire ne répond pas car ce n'est pas pour Sinatra, mais je pense que cela simplifie les dépendances.Réponses:
Sans configuration supplémentaire, Sinatra servira les actifs dans
public
. Pour l'itinéraire vide, vous voudrez rendre le document d'index.Les routes doivent retourner un
String
qui devient le corps de la réponse HTTP.File.read
ouvre un fichier, lit le fichier, ferme le fichier et renvoie un fichierString
.la source
send_file File.expand_path('index.html', settings.public)
.settings.public
parsettings.public_folder
pour obtenirsend_file File.expand_path('index.html', settings.public_folder)
send_file
, il fait des trucs supplémentaires pour vous github.com/sinatra/sinatra/blob/master/lib/sinatra/base.rb#L351File.read
lit le fichier entier en mémoire. Cela peut être correct ou non, selon la taille des fichiers et le nombre de demandes simultanées.Vous pouvez utiliser l'
send_file
assistant pour servir des fichiers.Cela servira à
index.html
partir de n'importe quel répertoire configuré comme contenant les fichiers statiques de votre application.la source
set :public_folder
, donc vous utiliseriez à lasettings.public_folder
place desettings.public
Vous pouvez simplement les héberger à partir du dossier public et ils n'ont pas besoin de routes.
Dans myapp.rb
Lien vers un sous-dossier en public
Tout dans ./public est accessible depuis '/whatever/bla.html
Exemple:
./public/stylesheets/screen.css
Sera accessible via '/stylesheets/screen.css' aucune route requise
la source
set :public_folder, 'public'
. C'était la clé pour le faire fonctionner, malgré la documentation de Sinatra impliquant que cela était déjà défini par défaut.Gardez à l'esprit qu'en production, votre serveur Web peut envoyer
index.html
automatiquement afin que la demande ne parvienne jamais à Sinatra. C'est meilleur pour les performances car vous n'avez pas à passer par la pile Sinatra / Rack juste pour servir du texte statique, ce que Apache / Nginx est génial à faire.la source
Sinatra devrait vous permettre de servir des fichiers statiques à partir du répertoire public comme expliqué dans la documentation :
la source
Ajouter la ligne ci-dessous dans le fichier rb principal
la source
le joyau sinatra-assetpack offre tout un tas de fonctionnalités. la syntaxe est douce:
alors que j'ai toujours des problèmes avec le pipeline des actifs de rails, j'ai l'impression d'avoir beaucoup plus de contrôle en utilisant sinatra-assetpack - mais la plupart du temps, cela ne fonctionne qu'avec quelques lignes de code.
la source
RÉPONSE MIS À JOUR : J'ai lié tout ce qui précède sans chance de pouvoir charger css, js .... etc contenu la seule chose qui était en cours de chargement est index.html ... et le reste allait = >>
404 error
Ma solution: le dossier de l'application ressemble à ceci.
index.rb
== >> Le code Sinatra va.public folder
== >> contient tout le reste ... css, js, bla bla..etc.Maintenant, démarrez le serveur et vous pourrez naviguer sans problème dans les pages statiques.
la source
la source
http://sinatrarb.com/configuration.html#static---enabledisable-static-file-routes
Ce serait la bonne façon de procéder.
J'ai utilisé le paramètre statique car il peut affecter l'utilisation du dossier public.
la source
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'
la source
Vous pouvez envisager de déplacer le
index.html
fichier versviews/index.erb
et de définir un point de terminaison comme:la source
Le placement de fichiers dans un
public
dossier a une limitation. En fait, lorsque vous êtes dans le'/'
chemin racine , cela fonctionne correctement car le navigateur définira le chemin relatif de votre fichier css par exemple/css/style.css
et sinatra recherchera le fichier dans lepublic
répertoire. 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 le problème, j'ai ajouté la redirection suivante pour charger correctement le fichier css:
la source
Et cette solution? :
donc si vous naviguez maintenant vers (par exemple) / sous-répertoire / test / il chargera le sous-répertoire / test / index.html
la source