使用Sinatra提供静态文件

TK.*_*TK. 138 ruby sinatra

我有一个页面网站只使用HTML,CSS和JavaScript.我想将应用程序部署到Heroku,但我找不到办法.我现在正试图让应用程序与Sinatra一起工作.

.
|-- application.css
|-- application.js
|-- index.html
|-- jquery.js
`-- myapp.rb
Run Code Online (Sandbox Code Playgroud)

以下是内容myapp.rb.

require 'rubygems'
require 'sinatra'

get "/" do
  # What should I write here to point to the `index.html`
end
Run Code Online (Sandbox Code Playgroud)

Rya*_*arn 167

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

require 'sinatra'

get '/' do
  send_file File.join(settings.public_folder, 'index.html')
end
Run Code Online (Sandbox Code Playgroud)

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

  • 我认为较新的Sinatra应用程序使用`set:public_folder`,因此您将使用`settings.public_folder`而不是`settings.public` (19认同)
  • 我更新了使用settings.public_folder的答案.较旧的应用可能仍需要使用settings.public. (4认同)

Tat*_*son 130

没有任何额外配置,Sinatra将为其提供资产public.对于空路线,您需要渲染索引文档.

require 'rubygems'
require 'sinatra'

get '/' do
  File.read(File.join('public', 'index.html'))
end
Run Code Online (Sandbox Code Playgroud)

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

  • 你应该做`send_file File.expand_path('index.html',settings.public)`. (52认同)
  • 现在这是不正确的.你应该用`settings.public_folder`替换`settings.public`来获取`send_file File.expand_path('index.html',settings.public_folder)` (32认同)
  • @zhirzh`send_file`,它为你做额外的东西https://github.com/sinatra/sinatra/blob/master/lib/sinatra/base.rb#L351 (2认同)

Mor*_*gan 61

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

.
-- myapp.rb
`-- public
    |-- application.css
    |-- application.js
    |-- index.html
    `-- jquery.js
Run Code Online (Sandbox Code Playgroud)

在myapp.rb中

set :public_folder, 'public'

get "/" do
  redirect '/index.html'
end
Run Code Online (Sandbox Code Playgroud)

链接到公共中的某个子文件夹

set :public_folder, 'public'
get "/" do
  redirect '/subfolder/index.html' 
end
Run Code Online (Sandbox Code Playgroud)

./public中的所有内容都可以从'/whatever/bla.html访问

示例:
./ public/styleslesheets/screen.css
可通过'/stylesheets/screen.css访问'无需路由


imi*_*ace 12

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

静态文件

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

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

  • 为什么这有4票?它没有回答在请求文件夹时如何呈现默认文档的问题. (4认同)

Rob*_*ron 12

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

  • 你如何在生产中配置它?我一直在寻找有关Sinatra和Rack的交叉引用的文档,但找不到它.基本上我希望index.html加载到任何/公共文件夹中,如果用户只放置文件夹名称,则该文件夹 (2认同)

Muh*_*lib 6

在主 rb 文件中添加以下行

set :public_folder, 'public'
Run Code Online (Sandbox Code Playgroud)