Servir les fichiers statiques avec Sinatra
J'ai une page de site web uniquement à l'aide de HTML, CSS et JavaScript. Je veux déployer l'application dans Heroku, mais je ne peux pas trouver un moyen de le faire. Je suis maintenant essayer de rendre l'application de travail 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
J'ai appris que l'accès localhost:2345/index.html fonctionne.
Vous pouvez utiliser WebBrick pour servir les fichiers statiques en quelques lignes.
Vous pouvez utiliser WebBrick pour servir les fichiers statiques en quelques lignes.
require 'webrick'; server = WEBrick::HTTPServer.new Port: 1234; server.mount '/', WEBrick::HTTPServlet::FileHandler, 'www/'; trap("INT") { server.stop }; server.start;
Puis exécutez ruby myapp.rb
. Supprimer le port pour Heroku. Mettre web: ruby myapp.rb
dans votre Procfile
. Le commentaire n'est pas de répondre que ce n'est pas pour Sinatra, mais je pense qu'il simplifie les dépendances.
OriginalL'auteur TK. | 2010-03-13
Vous devez vous connecter pour publier un commentaire.
Sans aucune configuration supplémentaire, Sinatra servira actifs dans
public
. Pour l'itinéraire vide, vous aurez envie de rendre le document d'index.Routes doit retourner un
String
qui deviennent le corps de la réponse HTTP.File.read
ouvre un fichier, lit le fichier, ferme le fichier et retourne unString
.send_file File.expand_path('index.html', settings.public)
.C'est maintenant incorrect. Vous devez remplacer
settings.public
avecsettings.public_folder
pour obtenirsend_file File.expand_path('index.html', settings.public_folder)
donc la méthode est prferrable: send_file ou d'un Fichier.lire?
il n'trucs supplémentaires pour vous github.com/sinatra/sinatra/blob/master/lib/sinatra/base.rb#L351
File.read
lit tout le fichier en mémoire. Cela peut être OK ou pas, en fonction de la taille des fichiers et le nombre de requêtes simultanées.OriginalL'auteur Tate Johnson
Vous pouvez utiliser le
send_file
de l'aide pour servir les fichiers.Ce sera
index.html
à partir de n'importe quel répertoire a été configuré comme ayant votre application fichiers statiques.set :public_folder
, donc vous l'utilisersettings.public_folder
au lieu desettings.public
J'ai mis à jour la réponse d'utiliser des paramètres.public_folder. Applications plus anciennes peuvent encore avoir besoin d'utiliser des paramètres.public.
OriginalL'auteur Ryan Ahearn
Vous pouvez simplement les accueillir à partir du dossier public et ils n'ont pas besoin de routes.
Dans la monapp.rb
Lien vers un sous-dossier dans le public
Tout ./le public est accessible à partir de '/whatever/bla.html
Exemple :
./public/stylesheets/écran.css
Seront accessibles via '/stylesheets/écran.css " pas d'itinéraire nécessaires
J'ai développé la solution. J'espère que cela aide à clarifier, tout est accessible au public, aucun itinéraire n'a été nécessaire juste omettre le "public" de la partie du chemin d'accès.
à l'aide de rackup sur Heroku, j'ai dû utiliser
set :public_folder, 'public'
. Qui a été la clé pour le faire fonctionner, en dépit de Sinatra de la documentation ce qui implique que cela a déjà été définie comme valeur par défaut.OriginalL'auteur Morgan
Gardez à l'esprit que dans la production, vous pouvez avoir votre serveur web envoyer
index.html
automatiquement, de sorte que la demande n'est jamais à Sinatra. C'est mieux pour la performance que vous n'avez pas à passer par la Sinatra/Rack pile juste pour servir de texte statique, qui est ce que Apache/Nginx sont génial à faire.Comment vous pouvez configurer cela dans la production? J'ai été la recherche de la documentation à propos de cette croix de référencement avec Sinatra et Rack, mais ne peut pas le trouver. Fondamentalement, je veux index.html pour être chargé dans n'importe quel /dossier public qui a une si l'utilisateur ne met que le nom du dossier
OriginalL'auteur Rob Cameron
Sinatra devrait vous permettre de servir les fichiers statiques à partir de l'annuaire public comme expliqué dans les docs:
OriginalL'auteur imightbeinatree at Cloudspace
la sinatra-assetpack gem propose tout un tas de fonctionnalités. la syntaxe est douce:
alors que je suis toujours avoir des problèmes avec les rails de l'actif pipeline j'ai l'impression d'avoir beaucoup plus de contrôle à l'aide de sinatra-assetpack - mais la plupart du temps, il travaille juste avec quelques lignes de code.
OriginalL'auteur jitter
MISE À JOUR DE RÉPONSE:
J'ai attaché tous les ci-dessus avec pas de chance d'être ablle charger css, js....etc contenu, la seule chose qui le chargement est index.html... et le reste allaient =>>
404 error
Ma solution: dossier app ressemble à ceci .
index.rb
==>> Sinatra code va .public folder
==>> qui contient tout le reste ...css , js , bla bla..etc.Maintenant démarrer le serveur et vous serez en mesure de naviguer à travers les pages statiques avec aucun problème.
OriginalL'auteur zee
Ajouter en dessous de la ligne principale de rb fichier
OriginalL'auteur Muhammad Aamir Talib
OriginalL'auteur Evan Ross
Vous pouvez envisager de déplacer les
index.html
fichier àviews/index.erb
, et de définir un point de terminaison comme:OriginalL'auteur bonh
De mettre des fichiers dans
public
dossier a une limitation. En fait, lorsque vous êtes dans la racine'/'
chemin est fonctionne correctement, car le navigateur va définir le chemin d'accès relatif de votre fichier css par exemple/css/style.css
et sinatra va chercher le fichier dans lepublic
répertoire. Toutefois, si votre emplacement est, par exemple,/user/create
, alors le navigateur web va chercher ton fichier css dans/user/create/css/style.css
et de l'échec.Comme une solution de contournement, j'ai ajouté la redirection suivante pour charger correctement le fichier css:
OriginalL'auteur Charmi
http://sinatrarb.com/configuration.html#static---enabledisable-static-file-routes
Ce serait la bonne façon de faire.
J'ai utilisé la statique parce que c'est paramètre peut affecter la public_folder utilisation.
OriginalL'auteur Hayden
Vous pouvez toujours utiliser Rack::Statique
https://www.rubydoc.info/gems/rack/Rack/Static
Ajoutez cette ligne juste avant d'exécuter la commande en "config.ru'
OriginalL'auteur r0ma
Ce que sur cette solution? :
donc, si vous naviguez maintenant à (par exemple) /sous-répertoire/test/il vous permettra de charger subdirectory/test/index.html
OriginalL'auteur heldopslippers