Mam jedną stronę internetową używającą tylko HTML, CSS i JavaScript. Chcę wdrożyć aplikację w Heroku, ale nie mogę znaleźć sposobu, aby to zrobić. Teraz próbuję, aby aplikacja działała z Sinatrą.
.
|-- application.css
|-- application.js
|-- index.html
|-- jquery.js
`-- myapp.rb
A oto treść 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;
Następnie biegnijruby myapp.rb
. Usuń port dla Heroku. Włóżweb: ruby myapp.rb
swójProcfile
. Komentarz nie odpowiada, bo to nie jest dla Sinatry, ale myślę, że to upraszcza zależności.Odpowiedzi:
Bez dodatkowej konfiguracji Sinatra będzie obsługiwać zasoby w formacie
public
. W przypadku pustej trasy będziesz chciał wyrenderować dokument indeksu.Trasy powinny zwracać a,
String
które stają się treścią odpowiedzi HTTP.File.read
otwiera plik, czyta plik, zamyka plik i zwraca plikString
.źródło
send_file File.expand_path('index.html', settings.public)
.settings.public
zsettings.public_folder
dostaćsend_file File.expand_path('index.html', settings.public_folder)
send_file
, robi dla Ciebie dodatkowe rzeczy github.com/sinatra/sinatra/blob/master/lib/sinatra/base.rb#L351File.read
czyta cały plik do pamięci. Może to być prawidłowe lub nie, w zależności od rozmiaru plików i liczby jednoczesnych żądań.Możesz użyć
send_file
pomocnika do obsługi plików.Będzie to służyć
index.html
z dowolnego katalogu, który został skonfigurowany jako zawierający pliki statyczne aplikacji.źródło
set :public_folder
, więcsettings.public_folder
zamiast tegosettings.public
Możesz po prostu hostować je z folderu publicznego i nie potrzebują tras.
W pliku myapp.rb
Link do jakiegoś publicznego podfolderu
Wszystko w ./public jest dostępne pod adresem „/cokolwiek/bla.html
Przykład:
./public/stylesheets/screen.css
Będzie dostępny za pośrednictwem „/stylesheets/screen.css”, trasa nie jest wymagana
źródło
set :public_folder, 'public'
. To było kluczem do jego działania, mimo że dokumentacja Sinatry sugerowała, że było to już ustawione jako domyślne.Pamiętaj, że w środowisku produkcyjnym możesz ustawić
index.html
automatyczne wysyłanie serwera WWW, aby żądanie nigdy nie dotarło do Sinatry. Jest to lepsze dla wydajności, ponieważ nie musisz przechodzić przez stos Sinatra / Rack tylko po to, aby wyświetlać statyczny tekst, w czym Apache / Nginx są niesamowici.źródło
Sinatra powinien pozwolić ci udostępniać pliki statyczne z katalogu publicznego, jak wyjaśniono w dokumentacji :
źródło
Dodaj poniższą linię w głównym pliku rb
źródło
Sinatra-assetpack gem oferuje całą masę funkcji. składnia jest słodka:
Podczas gdy nadal mam problemy z potokiem zasobów railsowych, czuję, że mam znacznie większą kontrolę przy użyciu sinatra-assetpack - ale w większości przypadków działa to po prostu z kilkoma wierszami kodu.
źródło
ZAKTUALIZOWANA ODPOWIEDŹ : Wiązałem wszystko powyższe, ale nie udało mi się załadować zawartości css, js .... itd. Jedyną rzeczą, która się ładowała, jest index.html ... a reszta to = >>
404 error
Moje rozwiązanie: folder aplikacji wygląda tak.
index.rb
== >> Kod Sinatra idzie.public folder
== >> zawiera wszystko inne ... css, js, blah blah..etc.Teraz uruchom serwer i będziesz mógł bez problemu poruszać się po statycznych stronach.
źródło
źródło
http://sinatrarb.com/configuration.html#static---enabledisable-static-file-routes
Byłby to właściwy sposób zrobienia tego.
Użyłem ustawienia statycznego, ponieważ jego ustawienie może wpłynąć na użycie public_folder.
źródło
Możesz rozważyć przeniesienie
index.html
pliku doviews/index.erb
i zdefiniowanie punktu końcowego, takiego jak:źródło
Zawsze możesz użyć Rack :: Static
https://www.rubydoc.info/gems/rack/Rack/Static
Po prostu dodaj tę linię przed poleceniem „uruchom” do „config.ru”
źródło
Umieszczanie plików w
public
folderze ma pewne ograniczenia. Właściwie, gdy jesteś w katalogu głównym,'/'
ścieżka działa poprawnie, ponieważ przeglądarka ustawi względną ścieżkę twojego pliku css na przykład,/css/style.css
a sinatra będzie szukał pliku wpublic
katalogu. Jeśli jednak Twoja lokalizacja to na przykład/user/create
, przeglądarka internetowa będzie szukać pliku css w/user/create/css/style.css
i zawiedzie.Aby obejść ten problem, dodałem następujące przekierowanie, aby poprawnie załadować plik css:
źródło
A co z tym rozwiązaniem? :
więc jeśli teraz przejdziesz do (na przykład) / subdirectory / test /, załaduje się podkatalog / test / index.html
źródło