使用Sinatra提供静态文件

时间:2010-03-13 05:38:32

标签: ruby 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

14 个答案:

答案 0 :(得分:164)

您可以使用send_file帮助程序来提供文件。

require 'sinatra'

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

这将从已配置为具有应用程序静态文件的任何目录中提供index.html

答案 1 :(得分:127)

如果没有任何其他配置,Sinatra将在public中提供资源。对于空路线,您需要渲染索引文档。

require 'rubygems'
require 'sinatra'

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

路由应返回String,它将成为HTTP响应正文。 File.read打开文件,读取文件,关闭文件并返回String

答案 2 :(得分:61)

您可以从公共文件夹托管它们,但它们不需要路由。

.
-- 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'访问,无需路由

答案 3 :(得分:12)

Sinatra应该允许您从公共目录as explained in the docs提供静态文件:

  

静态文件

     

静态文件从./public目录提供。您可以通过设置:public选项指定其他位置:

     

请注意,公共目录名称不包含在URL中。文件./public/css/style.css以example.com/css/style.css的形式提供。

答案 4 :(得分:12)

请记住,在制作过程中,您可以让您的网络服务器自动发送index.html,以便请求永远不会到达Sinatra。这对于性能更好,因为您不必通过Sinatra / Rack堆栈来提供静态文本,这正是Apache / Nginx非常棒的。

答案 5 :(得分:3)

在主rb文件中添加以下行

set :public_folder, 'public'

答案 6 :(得分:2)

sinatra-assetpack gem提供了大量功能。语法很好:

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

虽然我仍然遇到有关rails资产管道的问题,但我觉得我可以使用sinatra-assetpack进行更多控制 - 但大多数时候它只能使用几行代码。

答案 7 :(得分:2)

更新的答案: 我把所有上面的内容都绑在一起,没有运气加载css,js ....等内容,唯一加载的是index.html ......其余的都是=>> 404 error

我的解决方案: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,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$

现在启动服务器,您将能够毫无问题地浏览静态页面。

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

答案 8 :(得分: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

答案 9 :(得分:1)

您可以考虑将index.html文件移至views/index.erb,并定义端点,如:

get '/' do
  erb :index
end

答案 10 :(得分:1)

http://sinatrarb.com/configuration.html#static---enabledisable-static-file-routes

这是正确的做法。

set :public_folder, 'public'

我使用静态设置,因为它的设置会影响public_folder的使用。

答案 11 :(得分:0)

将文件放在public文件夹中有一个限制。实际上,当您在根'/'路径中工作正常时,因为浏览器将设置您的css文件的相对路径,例如/css/style.css,而sinatra将在public中查找该文件目录。但是,如果您的位置是/user/create,那么网络浏览器将在/user/create/css/style.css中查找您的css文件,并且会失败。

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

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

答案 12 :(得分:0)

您始终可以使用Rack :: Static

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

只需在“运行”命令之前将此行添加到“ config.ru”

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

答案 13 :(得分:-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

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