Statik dosyaları Sinatra ile sunma


139

Yalnızca HTML, CSS ve JavaScript kullanan bir sayfa web sitem var. Uygulamayı Heroku'ya dağıtmak istiyorum, ancak bunu yapmanın bir yolunu bulamıyorum. Şimdi uygulamanın Sinatra ile çalışmasını sağlamaya çalışıyorum.

.
|-- application.css
|-- application.js
|-- index.html
|-- jquery.js
`-- myapp.rb

Ve aşağıdakilerin içeriği myapp.rb.

require 'rubygems'
require 'sinatra'

get "/" do
  # What should I write here to point to the `index.html`
end

1
Localhost: 2345 / index.html dosyasına erişmenin işe yaradığını öğrendim .
TK.

Birkaç satırda statik dosyalar sunmak için WebBrick'i kullanabilirsiniz. require 'webrick'; server = WEBrick::HTTPServer.new Port: 1234; server.mount '/', WEBrick::HTTPServlet::FileHandler, 'www/'; trap("INT") { server.stop }; server.start;Sonra koş ruby myapp.rb. Heroku için bağlantı noktasını kaldırın. Put web: ruby myapp.rbSepetinde Procfile. Yorum, Sinatra için olmadığı için cevap vermiyor, ancak bence bağımlılıkları basitleştiriyor.
Chloe

Yanıtlar:


131

Herhangi bir ek yapılandırma olmadan, Sinatra'daki varlıklara hizmet edecektir public. Boş rota için dizin belgesini oluşturmak istersiniz.

require 'rubygems'
require 'sinatra'

get '/' do
  File.read(File.join('public', 'index.html'))
end

Rotalar StringHTTP yanıt gövdesi haline gelen bir döndürmelidir . File.readbir dosyayı açar, dosyayı okur, dosyayı kapatır ve a döndürür String.


52
Yapmayı tercih etmelisin send_file File.expand_path('index.html', settings.public).
Konstantin Haase

32
Bu artık yanlış. Sen değiştirmelisiniz settings.publicile settings.public_folderalmak içinsend_file File.expand_path('index.html', settings.public_folder)
Alistair Holt

2
@zhirzh send_file, bu ekstra şeyler yapar github.com/sinatra/sinatra/blob/master/lib/sinatra/base.rb#L351
iain

1
File.readtüm dosyayı belleğe okur. Bu, dosyaların boyutuna ve eşzamanlı isteklerin sayısına bağlı olarak Tamam veya değil olabilir.
Wayne Conrad

Tersi @WayneConrad, send_file tamam mı? ya da aynı şekilde mi davranıyor?
Ben

169

Dosyayı send_filesunmak için yardımcıyı kullanabilirsiniz .

require 'sinatra'

get '/' do
  send_file File.join(settings.public_folder, 'index.html')
end

Bu, index.htmluygulamanızın statik dosyalarına sahip olacak şekilde yapılandırılmış herhangi bir dizinden sunulur.


19
Sanırım daha yeni Sinatra uygulamaları kullanıyor set :public_folder, settings.public_folderbunun yerine kullanabilirsinizsettings.public
Andrew

4
Cevabı settings.public_folder kullanmak için güncelledim. Daha eski uygulamaların yine de settings.public kullanması gerekebilir.
Chad DeShon

62

Bunları yalnızca ortak klasörden barındırabilirsiniz ve rotalara ihtiyaç duymazlar.

.
-- myapp.rb
`-- public
    |-- application.css
    |-- application.js
    |-- index.html
    `-- jquery.js

Myapp.rb içinde

set :public_folder, 'public'

get "/" do
  redirect '/index.html'
end

Herkese açık bazı alt klasörlere bağlantı

set :public_folder, 'public'
get "/" do
  redirect '/subfolder/index.html' 
end

./Public içindeki her şeye '/whatever/bla.html adresinden erişilebilir.

Örnek:
./public/stylesheets/screen.css
'/stylesheets/screen.css' yoluyla erişilebilir.


1
herkese açık dizin olmasını istediğiniz index.html dosyaları olan birçok iç içe klasör (rota oluşturmak istemediğiniz) varsa ne olur?
Derek Prior

Çözümü genişlettim. Umarım açıklığa kavuşturmaya yardımcı olur, her şey halka açıktır, hiçbir yol gerekmez sadece yolun 'kamu' bölümünü atlayın.
Morgan

1
Heroku'da rackup kullanarak kullanmak zorunda kaldım set :public_folder, 'public'. Sinatra belgelerinin zaten varsayılan olarak ayarlandığını ima etmesine rağmen, bu çalışmanın anahtarı oldu.
Daniel C

12

Üretimde web sunucunuzun index.htmlotomatik olarak gönderilmesini sağlayabilirsiniz, böylece istek Sinatra'ya asla ulaşmaz. Bu performans için daha iyi çünkü sadece Statik metin sunmak için Sinatra / Rack yığınından geçmek zorunda değilsiniz, bu da Apache / Nginx'in harika bir şey.


Ah evet, duh. O zaman sadece Erb kullanacağım ve para kazanmak için Vernik kullanacağım.
ma11hew28

2
Bunu üretimde nasıl yapılandırıyorsunuz? Sinatra ve Rack ile bu çapraz referansla ilgili belgeleri arıyordum ancak bulamıyorum. Temel olarak kullanıcı yalnızca klasör adını koyarsa index.html herhangi bir / ortak klasöre yüklenmesini istiyorum

12

Sinatra , dokümanlarda açıklandığı gibi , genel dizinden statik dosyalar sunmanıza izin vermelidir :

Statik Dosyalar

Statik dosyalar ./public dizininden sunulur. : Public seçeneğini ayarlayarak farklı bir konum belirleyebilirsiniz:

Genel dizin adının URL'ye eklenmediğini unutmayın. Bir dosya ./public/css/style.css, example.com/css/style.css olarak kullanılabilir.


4
Bunun neden 4 oyu var? Bir klasör istendiğinde varsayılan bir belgenin nasıl sunulacağı sorusuna cevap vermez.
Derek Prior


2

sinatra-assetpack mücevher özellikleri bir sürü sunuyor. sözdizimi tatlıdır:

serve '/js', from: '/app/javascripts'

ben hala raylar varlıkları boru hattı ile sorunları yaşıyorum iken ben sinatra-assetpack kullanarak çok daha fazla kontrol var gibi hissediyorum - ama çoğu zaman sadece birkaç satır satır ile çalışır.


2

GÜNCEL YANIT : Yukarıdaki tüm yük css, js .... vb yüklemek için ablle olma şansı ile bağladım tek şey index.html olduğunu ... ve geri kalanı gidiyordu = >>404 error

Benim çözümüm: uygulama klasörü şöyle.

index.rb == >> Sinatra kodu gidiyor.

require 'rubygems'
require 'sinatra'

get '/' do
  html :index
end

def html(view)
  File.read(File.join('public', "#{view.to_s}.html"))
end

public folder== >> diğer her şeyi içerir ... css, js, blah blah..etc.

user@user-SVE1411EGXB:~/sintra1$ ls
index.rb  public
user@user-SVE1411EGXB:~/sintra1$ find public/
public/
public/index.html
public/about_us.html
public/contact.html
public/fonts
public/fonts/fontawesome-webfont.svg
public/fonts/fontawesome-webfont.ttf
public/img
public/img/drink_ZIDO.jpg
public/js
public/js/bootstrap.min.js
public/js/jquery.min.js
public/js/bootstrap.js
public/carsoul2.html
public/css
public/css/font-awesome-ie7.css
public/css/bootstrap.min.css
public/css/font-awesome.min.css
public/css/bootstrap.css
public/css/font-awesome.css
public/css/style.css
user@user-SVE1411EGXB:~/sintra1$

Şimdi sunucuyu başlatın ve sorunsuz sayfalarda sorunsuz bir şekilde gezinebileceksiniz.

user@user-SVE1411EGXB:~/sintra1$ ruby index.rb 
== Sinatra/1.4.5 has taken the stage on 4567 for development with backup from Thin
>> Thin web server (v1.5.1 codename Straight Razor)
>> Maximum connections set to 1024
>> Listening on localhost:4567, CTRL+C to stop

2
require 'rubygems'
require 'sinatra'

set :public_folder, File.dirname(__FILE__) + '/../client'
#client - it's folder with all your file, including myapp.rb

get "/" do
  File.read('index.html')
end


1

Sen hareketli düşünebilirsiniz index.htmldosyayı views/index.erbve benzeri bir bitiş noktası tanımlayan:

get '/' do
  erb :index
end


0

Dosyaları publicklasöre koymanın bir sınırlaması vardır. Aslında, kök '/'yolunda olduğunuzda tarayıcı çalışır çünkü örneğin css dosyanızın göreceli yolunu ayarlayacak /css/style.cssve sinatra publicdizindeki dosyayı arayacaktır . Ancak, konumunuz örneğin/user/create , web tarayıcısı css dosyanızı/user/create/css/style.css arayacak ve başarısız olacaktır.

Geçici bir çözüm olarak, css dosyasını doğru bir şekilde yüklemek için aşağıdaki yeniden yönlendirmeyi ekledim:

get %r{.*/css/style.css} do
    redirect('css/style.css')
end

-7

Bu çözüm ne olacak? :

get "/subdirectory/:file" do 
  file = params[:file] + "index.html"
  if File.exists?(params[:file])
    return File.open("subdirectory/" + file)
  else
   return "error"
  end
end

bu nedenle (örneğin) / alt dizin / test / öğesine giderseniz alt dizin / test / index.html

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.