2010-04-04 97 views
12

您可以通过将它们放置在public/(默认情况下)来为Sinatra提供静态文件 - 目前我有一个index.html,但是如何才能使该文件的根目录而不必将其解析为模板?Sinatra中的静态页面路由(Ruby)

要清楚,我可以成功访问/index.html,并且我想要将/路由为相同的静态文件,但不进行重定向。任何想法如何做到这一点?

回答

18

也许一个更好的答案最终会来,直到那时这是我的一枪。

如果这不是你想要的东西:

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

你可能会做这样的事情:

get '/' do 
    File.new('public/index.html').readlines 
end 

我与第一个去,虽然,不知道为什么你要避免那重定向

+0

表决对第一溶液进行说明。如果你使用乘客,这也行。不需要路由或重定向。 – rubiii 2010-04-04 18:20:22

+1

@rubii我认为这将是值得把乘客的方式在它自己的答案。这似乎是比我更正确的答案 – 2010-04-04 18:24:49

+0

我认为你的答案是完全正确的。我敢打赌,JP不使用乘客。但我会为其他人发布答案。 – rubiii 2010-04-04 19:31:05

3

使用passenger这似乎开箱即用。在公共目录中有一个index.html文件,并且在访问根url时不会产生index.html。

6

只需在应用程序类中设置enable :static即可。像这样:

class App < Sinatra::Base 
    # Set the app root; this is where the 'public' and 'views' 
    # directories are found (by default). 
    set :root, File.expand_path("#{File.dirname(__FILE__)}/../app") 

    # Allow the app to serve static files from the 'public' directory in :root 
    enable :static 
end 
3

我认为这仅仅是一个问题,因为西纳特拉/机架没有缺省文件的理念服务,如果你只是去/。在像Apache或Nginx这样的网络服务器中,这项工作会为您提供帮助,通常默认为index.html index.htm(如果存在,则在转至目录时没有实际文件名)。

当大家都说这是构建到Passenger中时,我认为它们确实意味着它构建在Apache/Nginx中。 Apache/Nginx会检查静态文件是否存在,如果有,它将不会到达Rack,这对性能非常棒。

我不想设置重定向到404页面,因为这种做法违反了HTTP的整个想法:应该有一个终结点的端点应该返回该端点的真实状态。这意味着如果你去/asdf网络服务器报告404,因为这是实际发生的事情。如果你做了重定向,现在你的网站说“我曾经在这里有东西,但是它已经移动了”,然后它重定向你的页面,即使它在页面文本中说404,实际上是由网页报告的服务器为200,意思是“这个网页一切都很好!”