用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响应体的String
。 File.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