Ich habe eine einseitige Website, die nur HTML, CSS und JavaScript verwendet. Ich möchte die App für Heroku bereitstellen, kann aber keinen Weg finden, dies zu tun. Ich versuche jetzt, die App mit Sinatra zum Laufen zu bringen.
.
|-- application.css
|-- application.js
|-- index.html
|-- jquery.js
`-- myapp.rb
Und das Folgende ist der Inhalt von 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;
Dann renneruby myapp.rb
. Entfernen Sie den Anschluss für Heroku. Setzen Sieweb: ruby myapp.rb
IhreProcfile
. Kommentar nicht antworten, da es nicht für Sinatra ist, aber ich denke, es vereinfacht Abhängigkeiten.Antworten:
Ohne zusätzliche Konfiguration wird Sinatra Assets in bereitstellen
public
. Für die leere Route möchten Sie das Indexdokument rendern.Routen sollten a zurückgeben,
String
das zum HTTP-Antworttext wird.File.read
öffnet eine Datei, liest die Datei, schließt die Datei und gibt a zurückString
.quelle
send_file File.expand_path('index.html', settings.public)
.settings.public
mitsettings.public_folder
bekommensend_file File.expand_path('index.html', settings.public_folder)
send_file
, es macht zusätzliche Dinge für Sie github.com/sinatra/sinatra/blob/master/lib/sinatra/base.rb#L351File.read
Liest die gesamte Datei in den Speicher. Dies kann in Ordnung sein oder nicht, abhängig von der Größe der Dateien und der Anzahl der gleichzeitigen Anforderungen.Sie können den
send_file
Helfer verwenden, um Dateien bereitzustellen.Dies dient
index.html
aus jedem Verzeichnis, in dem die statischen Dateien Ihrer Anwendung konfiguriert sind.quelle
set :public_folder
, also würden Siesettings.public_folder
anstelle vonsettings.public
Sie können sie einfach aus dem öffentlichen Ordner hosten und sie benötigen keine Routen.
In der myapp.rb
Link zu einem öffentlichen Unterordner
Alles in ./public ist über '/whatever/bla.html zugänglich
Beispiel:
./public/stylesheets/screen.css
Der Zugriff erfolgt über '/stylesheets/screen.css'. Keine Route erforderlich
quelle
set :public_folder, 'public'
. Dies war der Schlüssel, damit es funktioniert, obwohl die Sinatra-Dokumentation impliziert, dass dies bereits als Standard festgelegt wurde.Denken Sie daran, dass Sie in der Produktion Ihren Webserver
index.html
automatisch senden lassen können, damit die Anfrage niemals an Sinatra geht. Dies ist besser für die Leistung, da Sie nicht den Sinatra / Rack-Stapel durchlaufen müssen, um statischen Text bereitzustellen, was Apache / Nginx hervorragend können.quelle
Mit Sinatra sollten Sie statische Dateien aus dem öffentlichen Verzeichnis bereitstellen können, wie in den Dokumenten erläutert :
quelle
Fügen Sie die folgende Zeile in die Haupt-RB-Datei ein
quelle
Das Sinatra-Assetpack- Juwel bietet eine ganze Reihe von Funktionen. Syntax ist süß:
Während ich immer noch Probleme mit der Rails-Assets-Pipeline habe, habe ich das Gefühl, dass ich mit sinatra-assetpack viel mehr Kontrolle habe - aber meistens funktioniert es nur mit ein paar Codezeilen.
quelle
AKTUALISIERTE ANTWORT : Ich habe alle oben genannten Punkte gebunden, ohne das Glück zu haben, CSS-, JS- usw. Inhalte laden zu können. Das einzige, was geladen wurde, ist index.html ... und der Rest ging = >>
404 error
Meine Lösung: Der App-Ordner sieht so aus.
index.rb
== >> Sinatra Code geht.public folder
== >> enthält alles andere ... css, js, bla bla ... etc.Starten Sie nun den Server und Sie können problemlos durch statische Seiten navigieren.
quelle
quelle
http://sinatrarb.com/configuration.html#static---enabledisable-static-file-routes
Dies wäre der richtige Weg.
Ich habe die statische Einstellung verwendet, da diese die Verwendung von public_folder beeinflussen kann.
quelle
Sie können die
index.html
Datei verschiebenviews/index.erb
und einen Endpunkt wie folgt definieren:quelle
Das Ablegen von Dateien in
public
Ordnern unterliegt einer Einschränkung. Wenn Sie sich im Stammpfad'/'
befinden, funktioniert dies tatsächlich korrekt, da der Browser beispielsweise den relativen Pfad Ihrer CSS-Datei/css/style.css
festlegt und sinatra nach der Datei impublic
Verzeichnis sucht . Wenn sich Ihr Standort jedoch beispielsweise befindet/user/create
, sucht der Webbrowser nach Ihrer CSS-Datei/user/create/css/style.css
und schlägt fehl.Um dieses Problem zu umgehen, habe ich die folgende Umleitung hinzugefügt, um die CSS-Datei korrekt zu laden:
quelle
Sie können jederzeit Rack :: Static verwenden
https://www.rubydoc.info/gems/rack/Rack/Static
Fügen Sie einfach diese Zeile vor dem Befehl 'run' in 'config.ru' ein.
quelle
Was ist mit dieser Lösung? ::
Wenn Sie jetzt zu (zum Beispiel) / Unterverzeichnis / Test / navigieren, wird das Unterverzeichnis / Test / Index.html geladen
quelle