सिनात्रा के साथ स्थिर फ़ाइलों की सेवा


139

मेरे पास केवल HTML, CSS और JavaScript का उपयोग करके एक पेज की वेबसाइट है। मैं ऐप को हरोकू में तैनात करना चाहता हूं, लेकिन मुझे ऐसा करने का कोई तरीका नहीं मिला। अब मैं सिनात्रा के साथ काम करने वाले ऐप को बनाने की कोशिश कर रहा हूं।

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

और निम्नलिखित की सामग्री है myapp.rb

require 'rubygems'
require 'sinatra'

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

1
मैंने सीखा है कि लोकलहोस्टिंग एक्सेस करना : 2345 / index.html काम करता है।
टी.के.

आप कुछ लाइनों में स्थिर फ़ाइलों की सेवा के लिए WebBrick का उपयोग कर सकते हैं। require 'webrick'; server = WEBrick::HTTPServer.new Port: 1234; server.mount '/', WEBrick::HTTPServlet::FileHandler, 'www/'; trap("INT") { server.stop }; server.start;फिर चला ruby myapp.rb। Heroku के लिए पोर्ट निकालें। web: ruby myapp.rbअपने में रखो Procfile। टिप्पणी का जवाब नहीं है क्योंकि यह सिनात्रा के लिए नहीं है, लेकिन मुझे लगता है कि यह निर्भरता को सरल करता है।
क्लो

जवाबों:


131

किसी भी अतिरिक्त विन्यास के बिना, सिनात्रा में परिसंपत्तियों की सेवा करेगा public। खाली मार्ग के लिए, आप सूचकांक दस्तावेज़ को प्रस्तुत करना चाहते हैं।

require 'rubygems'
require 'sinatra'

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

मार्गों को वापस आना चाहिए Stringजो HTTP प्रतिसाद निकाय बन जाते हैं। File.readएक फ़ाइल खोलता है, फ़ाइल पढ़ता है, फ़ाइल बंद करता है और वापस लौटता है String


52
बल्कि आपको करना चाहिए send_file File.expand_path('index.html', settings.public)
कोनस्टेंटिन हासे

32
यह अब गलत है। आप बदलना चाहिए settings.publicसाथ settings.public_folderपाने के लिएsend_file File.expand_path('index.html', settings.public_folder)
एलिस्टेयर होल्ट

2
@zhirzh send_file, इसके लिए आपको अतिरिक्त सामान करता github.com/sinatra/sinatra/blob/master/lib/sinatra/base.rb#L351
इयान

1
File.readपूरी फाइल को मेमोरी में पढ़ता है। फ़ाइलों के आकार और समवर्ती अनुरोधों की संख्या के आधार पर यह ठीक है या नहीं।
वेन कॉनराड

@AyneConrad विपरीत पर, send_file ठीक है? या यह एक ही कार्य करता है?
बेन

169

आप send_fileफ़ाइलों की सेवा करने के लिए सहायक का उपयोग कर सकते हैं ।

require 'sinatra'

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

यह index.htmlआपके एप्लिकेशन की स्थिर फ़ाइलों के रूप में जो भी निर्देशिका कॉन्फ़िगर की गई है, उससे काम करेगा ।


19
मुझे लगता है कि नए सिनात्रा ऐप्स का उपयोग करना set :public_folderहै, तो आप का प्रयोग करेंगे settings.public_folderके बजायsettings.public
एंड्रयू

4
मैंने settings.public_folder का उपयोग करने के लिए उत्तर अपडेट किया। पुराने ऐप्स को अभी भी settings.public का उपयोग करने की आवश्यकता हो सकती है।
चाड देसन

62

आप उन्हें सार्वजनिक फ़ोल्डर से होस्ट कर सकते हैं और उन्हें मार्गों की आवश्यकता नहीं है।

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

Myapp.rb में

set :public_folder, 'public'

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

सार्वजनिक रूप से कुछ उप फ़ोल्डर से लिंक करें

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

//Public '/whatever/bla.html' से सब कुछ सुलभ है

उदाहरण :
/public/stylesheets/screen.css
'/stylesheets/screen.css' के माध्यम से पहुँचा जा सकेगा।


1
क्या होगा यदि सार्वजनिक में कई नेस्टेड फ़ोल्डर हैं (जिनके लिए आप रूट नहीं बनाना चाहते हैं) जिनमें index.html फाइलें हैं जो आप डिफ़ॉल्ट होना चाहते हैं?
डेरेक प्रायर

मैंने समाधान का विस्तार किया है। मुझे उम्मीद है कि यह स्पष्ट करने में मदद करता है, सब कुछ सार्वजनिक रूप से सुलभ है, किसी भी मार्ग की आवश्यकता नहीं है जो कि पथ के 'सार्वजनिक' भाग को छोड़ देता है।
मॉर्गन

1
हेरोकू पर रैकअप का उपयोग करना था set :public_folder, 'public'। यह काम करने के लिए महत्वपूर्ण था, सिनात्रा प्रलेखन के बावजूद कि यह पहले से ही डिफ़ॉल्ट रूप में सेट किया गया था।
डैनियल सी

12

ध्यान रखें कि उत्पादन में आप अपने वेब सर्वर को index.htmlस्वचालित रूप से भेज सकते हैं ताकि अनुरोध कभी भी सिनात्रा को न मिले। यह प्रदर्शन के लिए बेहतर है क्योंकि आपको सिनात्रा / रैक स्टैक से गुजरना नहीं है बस स्थैतिक पाठ की सेवा करना है, जो कि अपाचे / नग्नेक्स कमाल कर रहे हैं।


ओह, हाँ। मैं तो बस Erb का उपयोग करूँगा और वार्निश का उपयोग इसे नकद करने के लिए करूँगा।
ma11hew28

2
आप इसे उत्पादन में कैसे कॉन्फ़िगर करते हैं? मैं सिनात्रा और रैक के साथ इस क्रॉस रेफ़रिंग के बारे में दस्तावेज़ीकरण खोज रहा हूं लेकिन यह नहीं मिल रहा है। मूल रूप से मैं चाहता हूं कि index.html किसी भी / सार्वजनिक फ़ोल्डर में लोड किया जाए जिसमें एक है यदि उपयोगकर्ता केवल फ़ोल्डर का नाम रखता है

12

डॉयात्रा में बताए अनुसार सिनात्रा को आपको सार्वजनिक निर्देशिका से स्थिर फाइलें परोसनी चाहिए :

स्थैतिक फ़ाइलें

./Public निर्देशिका से स्टेटिक फाइलें परोसी जाती हैं। आप एक अलग स्थान निर्दिष्ट कर सकते हैं: सार्वजनिक विकल्प:

ध्यान दें कि सार्वजनिक निर्देशिका नाम URL में शामिल नहीं है। एक फ़ाइल। Public/css/style.css को example.com/css/style.css के रूप में उपलब्ध कराया गया है।


4
इसके पास 4 वोट क्यों हैं? यह इस सवाल का जवाब नहीं देता है कि जब एक फ़ोल्डर का अनुरोध किया जाता है तो डिफ़ॉल्ट दस्तावेज़ कैसे प्रस्तुत करें।
डेरेक प्रायर


2

सिनात्रा-assetpack मणि सुविधाओं की एक पूरी गुच्छा प्रदान करता है। वाक्यविन्यास मधुर है:

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

जबकि मैं अभी भी रेल संपत्ति परिसंपत्तियों के साथ समस्या कर रहा हूँ, मुझे लगता है कि मैं बहुत अधिक नियंत्रण है सिनट्रा-एसेटपैक का उपयोग करके - लेकिन ज्यादातर बार यह कोड की कुछ पंक्तियों के साथ काम करता है।


2

अद्यतन किया गया उत्तर : मैंने उपरोक्त सभी को सीएसएस, js आदि लोड करने के लिए किसी भी तरह के भाग्य के साथ नहीं जोड़ा है ... आदि केवल लोड होने वाली चीज है index.html ... और बाकी सभी =404 error

मेरा समाधान: ऐप फ़ोल्डर इस तरह दिखता है।

index.rb == >> सिनात्रा कोड जाता है।

require 'rubygems'
require 'sinatra'

get '/' do
  html :index
end

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

public folder== >> बाकी सब कुछ शामिल है ... सीएसएस, जेएस, ब्ला ब्ला।

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$

अब सर्वर शुरू करें और आप बिना किसी समस्या के स्थैतिक पृष्ठों पर नेविगेट कर पाएंगे।

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

आप index.htmlफ़ाइल को आगे बढ़ने पर विचार कर सकते हैं views/index.erb, और एक समापन बिंदु को परिभाषित कर सकते हैं जैसे:

get '/' do
  erb :index
end

1

आप हमेशा रैक :: स्टेटिक का उपयोग कर सकते हैं

https://www.rubydoc.info/gems/rack/Rack/Static

इस लाइन को 'config.ru' में 'रन' कमांड से पहले जोड़ें

use Rack::Static, :urls => [""], :root => 'public', :index => 'index.html'

0

फ़ाइलों को publicफ़ोल्डर में रखना एक सीमा है। असल में, जब आप रूट '/'पथ में होते हैं तो सही तरीके से काम करता है क्योंकि ब्राउज़र उदाहरण के लिए आपकी सीएसएस फ़ाइल के सापेक्ष पथ को सेट करेगा /css/style.cssऔर publicनिर्देशिका में साइनट्रा फ़ाइल की तलाश करेगा । हालाँकि, यदि आपका स्थान उदाहरण के लिए है /user/create, तो वेब ब्राउज़र आपकी css फ़ाइल को खोजेगा /user/create/css/style.cssऔर विफल हो जाएगा।

वर्कअराउंड के रूप में, मैंने सीएसएस फ़ाइल को सही ढंग से लोड करने के लिए निम्नलिखित रीडायरेक्शन को जोड़ा:

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

-7

इस समाधान के बारे में क्या? :

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

इसलिए यदि आप अब (उदाहरण के लिए) / उपनिर्देशिका / परीक्षण पर नेविगेट करते हैं / तो यह उपनिर्देशिका / परीक्षण / index.html लोड करेगा

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.