Sinatra中的静态页面路由(Ruby)

时间:2010-04-04 18:08:01

标签: ruby routing sinatra

您可以通过将静态文件放在public/(默认情况下)中来提供静态文件 - 目前我有一个index.html,但是如何将根点指向该文件而不必将其解析为模板?

要清楚,我可以成功访问/index.html,并且我想将/路由为相同的静态文件,但不重定向。知道怎么做吗?

5 个答案:

答案 0 :(得分:20)

最终可能会有一个更好的答案,直到那时这才是我的目标。

如果这不是您想要的:

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

您可能会这样做:

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

我会选择第一个,但不确定为什么要避免重定向

答案 1 :(得分:6)

只需在app类中设置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

答案 2 :(得分:3)

使用passenger这似乎开箱即用。在公共目录中有一个index.html文件,并且在访问根URL时没有路由引出index.html。

答案 3 :(得分:3)

我认为这只是一个问题,因为如果你只是去/,Sinatra / Rack没有默认文件的概念。在像Apache或Nginx这样的网络服务器中,这将由你负责,并且通常默认为index.html index.htm(如果存在,它将在到达目录中没有实际文件名的目录时得到服务。)

当每个人都说这是内置于Passenger时,我认为它们的确意味着它内置于Apache / Nginx中。 Apache / Nginx将检查静态文件是否存在并提供服务(如果存在),请求将永远不会到达Rack,这对于性能来说非常棒。

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

答案 4 :(得分:2)

有一个宝石&#34; sinatra-index&#34;解决这个问题。

https://github.com/elitheeli/sinatra-index