Saya memiliki satu halaman situs web hanya menggunakan HTML, CSS dan JavaScript. Saya ingin menyebarkan aplikasi ke Heroku, tetapi saya tidak dapat menemukan cara untuk melakukannya. Saya sekarang mencoba membuat aplikasi bekerja dengan Sinatra.
.
|-- application.css
|-- application.js
|-- index.html
|-- jquery.js
`-- myapp.rb
Dan berikut ini adalah isi dari 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;
Kemudian jalankanruby myapp.rb
. Hapus port untuk Heroku. Masukanweb: ruby myapp.rb
dalam AndaProcfile
. Komentar tidak menjawab karena bukan untuk Sinatra, tapi saya pikir ini menyederhanakan ketergantungan.Jawaban:
Tanpa konfigurasi tambahan, Sinatra akan melayani aset di
public
. Untuk rute kosong, Anda harus merender dokumen indeks.Rute harus mengembalikan
String
yang menjadi badan respons HTTP.File.read
membuka file, membaca file, menutup file dan mengembalikan aString
.sumber
send_file File.expand_path('index.html', settings.public)
.settings.public
dengansettings.public_folder
untuk mendapatkansend_file File.expand_path('index.html', settings.public_folder)
send_file
, itu melakukan hal-hal tambahan untuk Anda github.com/sinatra/sinatra/blob/master/lib/sinatra/base.rb#L351File.read
membaca seluruh file ke dalam memori. Ini bisa OK atau tidak, tergantung pada ukuran file dan jumlah permintaan bersamaan.Anda dapat menggunakan
send_file
helper untuk melayani file.Ini akan berfungsi
index.html
dari direktori apa pun yang telah dikonfigurasi memiliki file statis aplikasi Anda.sumber
set :public_folder
, jadi Anda akan menggunakansettings.public_folder
sebagai gantinyasettings.public
Anda bisa menghosting mereka dari folder publik dan mereka tidak perlu rute.
Di myapp.rb
Tautan ke beberapa sub folder di depan umum
Semua yang ada di ./publik dapat diakses dari '/apa pun/bla.html
Contoh:
./public/stylesheets/screen.css
Akan dapat diakses melalui '/stylesheets/screen.css' tidak perlu rute
sumber
set :public_folder, 'public'
. Itu adalah kunci untuk membuatnya berfungsi, meskipun dokumentasi Sinatra menyiratkan bahwa ini sudah ditetapkan sebagai default.Perlu diingat bahwa dalam produksi, server web Anda dapat mengirim
index.html
secara otomatis sehingga permintaan tidak pernah sampai ke Sinatra. Ini lebih baik untuk kinerja karena Anda tidak harus melalui tumpukan Sinatra / Rack hanya untuk menyajikan teks statis, yang merupakan hal yang luar biasa dilakukan oleh Apache / Nginx.sumber
Sinatra seharusnya membiarkan Anda menyajikan file statis dari direktori publik seperti yang dijelaskan dalam dokumen :
sumber
Tambahkan baris di bawah ini di file rb utama
sumber
yang sinatra-assetpack permata menawarkan sejumlah fitur. Sintaksnya manis:
sementara saya masih mengalami masalah dengan pipeline aset rel saya merasa seperti saya memiliki kontrol lebih banyak menggunakan sinatra-assetpack - tetapi sebagian besar waktu itu hanya bekerja dengan beberapa baris kode.
sumber
JAWABAN TERBARU YANG : Saya mengikat semua hal di atas tanpa keberuntungan bisa memuat css, js .... dll. Konten satu-satunya yang memuat adalah index.html ... dan sisanya berjalan = >>
404 error
Solusi saya: folder aplikasi terlihat seperti ini.
index.rb
== >> Kode Sinatra berjalan.public folder
== >> berisi yang lainnya ... css, js, blah blah..etc.Sekarang mulai server dan Anda akan dapat menavigasi halaman statis tanpa masalah.
sumber
sumber
http://sinatrarb.com/configuration.html#static---enabledisable-static-file-routes
Ini akan menjadi cara yang benar untuk melakukannya.
Saya menggunakan pengaturan statis karena pengaturannya dapat memengaruhi penggunaan public_folder.
sumber
Anda mungkin mempertimbangkan untuk memindahkan
index.html
file keviews/index.erb
, dan mendefinisikan titik akhir seperti:sumber
Anda selalu dapat menggunakan Rack :: Static
https://www.rubydoc.info/gems/rack/Rack/Static
Cukup tambahkan baris ini sebelum perintah 'run' ke 'config.ru'
sumber
Menempatkan file dalam
public
folder memiliki batasan. Sebenarnya, ketika Anda berada di'/'
path root berfungsi dengan benar karena browser akan menetapkan path relatif file css Anda misalnya/css/style.css
dan sinatra akan mencari file dipublic
direktori. Namun, jika lokasi Anda misalnya/user/create
, maka browser web akan mencari file css Anda/user/create/css/style.css
dan akan gagal.Sebagai solusinya, saya menambahkan pengalihan berikut untuk memuat file css dengan benar:
sumber
Bagaimana dengan solusi ini? :
jadi jika sekarang Anda menavigasi ke (misalnya) / subdirektori / test / itu akan memuat subdirektori / test / index.html
sumber