布局路径在Sinatra中不起作用

时间:2017-03-04 20:49:56

标签: ruby sinatra haml

将Sinatra用于Web框架和HAML用于页面,我在/views/layout.haml处有一个布局文件。我在/public中也有javascript和css文件。在布局脚本和css中定义类似于:

%script{:type => "text/javascript", :src => "test.js"}
%link{:rel => "stylesheet", :type => "text/css", :href => "test.css"}

当我在Sinatra中定义基本路线时,一切正常:

get '/' do
  haml :index
end

但是当路线有多个部分,例如' / route / 1'时,test.jstest.css的路径突然不再有效。 haml文件正确加载,但布局中的路径不再有效。

在对某些内容进行实验后,如果我将路径更改为"//public/test.js",而不仅仅是"test.js",则会再次加载...但仅适用于路由/route/1。不幸的是,第一条路线/不再加载。

在Sinatra中,这通常如何处理这样的路线?

1 个答案:

答案 0 :(得分:1)

您只需要确保您的网址是绝对的。

使用:src => "test.js",浏览器会发出相对于当前网址的请求。因此,对于根/,请求将针对/test.js并且可以正常运行,但是当当前页面为/route/1时,请求将转到/route/test.js并且将失败。

直接修复只是将/添加到网址,以使路径成为绝对路径:

%script{:type => "text/javascript", :src => "/test.js"}

更强大的解决方案是使用url helper

%script{:type => "text/javascript", :src => url("/test.js")}

这将确保您的应用即使安装在您的网络服务器根目录以外的其他位置也能正常工作。