2010-03-13 205 views
133

我只有一个页面网站使用HTML,CSS和JavaScript。我想将应用程序部署到Heroku,但我找不到一种方法来实现它。我现在试图让这个应用程序与Sinatra合作。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 
+1

我了解到访问http:// localhost:2345/index.html的作品。 – 2010-03-20 11:11:22

+0

您可以使用WebBrick在几行中提供静态文件。 '需要'webrick'; server = WEBrick :: HTTPServer.new Port:1234;服务器。mount'/',WEBrick :: HTTPServlet :: FileHandler,'www /';陷阱(“INT”){server.stop}; server.start;'然后运行'ruby myapp.rb'。删除Heroku的端口。把'web:ruby myapp.rb'放到你的'Procfile'中。评论没有回答,因为它不是Sinatra,但我认为它简化了依赖关系。 – Chloe 2016-01-16 07:09:36

回答

121

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

require 'rubygems' 
require 'sinatra' 

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

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

+51

你应该'send_file File.expand_path('index.html',settings.public)'。 – 2012-01-04 16:31:35

+31

现在这是不正确的。你应该用'settings.public_folder'替换'settings.public'来获得'send_file File.expand_path('index.html',settings.public_folder)' – alistairholt 2013-02-04 18:18:31

+0

,以便哪种方法是可用的:send_file或File.read? – zhirzh 2015-11-03 04:41:33

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

10

西纳特拉应该让你从公共目录as explained in the docs提供静态文件:

静态文件

静态文件是从./public目录服务。您可以通过设置以下选项来指定其他位置:公共选项:

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

+4

这为什么有4票?它不回答如何在请求文件夹时显示默认文档的问题。 – 2012-04-27 13:49:44

11

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

+0

哦,是的,杜。然后我会使用Erb并使用Varnish来兑现它。 – ma11hew28 2011-02-14 23:33:19

+2

如何在生产中对此进行配置?我一直在寻找关于与Sinatra和Rack交叉引用的文档,但找不到它。基本上我想index.html被加载到任何/公共文件夹中,如果用户只放置文件夹名称 – 2013-04-25 18:47:21

160

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

require 'sinatra' 

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

这将有助于从任何目录已经被配置为具有应用程序的静态文件index.html

+18

我认为新的Sinatra应用程序使用'set:public_folder',所以你会使用'settings.public_folder'而不是' settings.public' – Andrew 2011-11-10 16:55:57

+3

我更新了使用settings.public_folder的答案。较旧的应用程序可能仍然需要使用settings.public。 – 2012-02-20 15:50:09

57

你可以将它们从公共文件夹放置并且不需要路由。

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

在myapp.rb

set :public_folder, 'public' 

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

链接到一些子文件夹在./public公共

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

一切都是从“/不管/ BLA访问。HTML

例子:
./public/stylesheets/screen.css
将通过访问 '/stylesheets/screen.css' 没有路线所需

+1

如果public有很多嵌套的文件夹(你不想创建路由),那么你想要默认的index.html文件呢? – 2012-04-27 13:51:56

+0

我已经扩展了解决方案。我希望这有助于澄清,一切都可以在公共场合使用,不需要路线就可以省略路径中的“公共”部分。 – Morgan 2012-04-28 16:12:30

+1

在Heroku上使用rackup我不得不使用'set:public_folder,'public''。尽管Sinatra的文件暗示这已经被设定为默认值,但这是实现它的关键。 – 2014-01-21 22:36:49

2

sinatra-assetpack宝石提供了一大堆的功能。语法是甜蜜的:

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

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

1

你可能会考虑index.html文件移动到views/index.erb,并定义像一个端点:在public文件夹

get '/' do 
    erb :index 
end 
0

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

作为一种变通方法,添加以下重定向到正确加载CSS文件:

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

修订ANSWER: 我绑所有上述没有运气被ablle的加载CSS,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 == >>包含一切...... CSS,JS,等等blah..etc。

[email protected]:~/sintra1$ ls 
index.rb public 
[email protected]:~/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 
[email protected]:~/sintra1$ 

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

[email protected]:~/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

添加以下行主RB文件

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