用Sinatra提供静态文件

我只有一个页面网站使用HTML,CSS和JavaScript。 我想部署到Heroku的应用程序,但我找不到办法。 我现在正在努力使该应用程序与Sinatra合作。

. |-- 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 

没有任何额外的configuration,Sinatra将在public服务资产。 对于空路线,您需要渲染索引文档。

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

路由应该返回一个成为HTTP响应体的StringFile.read打开一个文件,读取文件,closures文件并返回一个String

您可以使用send_file助手来提供文件。

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

这将服务于任何目录已经被configuration为具有您的应用程序的静态文件的index.html

你可以只从公用文件夹托pipe他们,他们不需要路由。

 . -- 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”访问,不需要路由

请记住,在生产中,您可以让您的Web服务器自动发送index.html以便请求永远不会来到Sinatra。 这对于性能来说更好,因为您不需要通过Sinatra / Rack堆栈来提供静态文本,而这正是Apache / Nginx所做的。

Sinatra应该让你从公共目录提供静态文件, 如文档中所述 :

静态文件

静态文件由./public目录提供。 您可以通过设置:public选项来指定不同的位置:

请注意,公共目录名称不包含在URL中。 一个文件./public/css/style.css作为example.com/css/style.css。

sinatra-assetpack gem提供了一大堆function。 语法很好听:

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

虽然我仍然有轨道资产pipe道的问题,我觉得我有更多的控制使用sinatra-assetpack – 但大多数时候它只是用几行代码工作。

更新答案 :我把所有以上都没有运气的ablle加载CSS,JS ….等内容加载的唯一的东西是index.html …其余的都= >> 404 error

我的解决scheme:app文件夹看起来像这样。

index.rb == >> Sinatra代码去。

 require 'rubygems' require 'sinatra' get '/' do html :index end def html(view) File.read(File.join('public', "#{view.to_s}.html")) end 

public folder == >>包含一切… CSS,JS,等等等等。

 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 

在主要的rb文件中添加下面的行

 set :public_folder, 'public' 
 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 

您可能会考虑将index.html文件移到views/index.erb ,并定义如下的端点:

 get '/' do erb :index end 

将文件放在公用文件夹中有一个限制。 实际上,当你在根目录的'/'path中工作正常,因为浏览器会设置你的css文件的相对path,例如/css/style.css会在public目录下查找这个文件。 但是,如果您的位置是/user/create ,那么Web浏览器将在/user/create/css/style.css查找您的css文件,并将失败。

作为一种解决方法,我添加了以下redirect来正确加载css文件:

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

这个解决scheme呢? :

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

所以如果你现在导航到(例如)/子目录/testing/它会加载子目录/ test / index.html