布局路径在 Sinatra 中不起作用

Layout paths not working in Sinatra

Web 框架使用 Sinatra,页面使用 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 中通常如何处理这样的路由?

您只需要确保您的 url 是绝对的。

使用:src => "test.js",浏览器会发出一个请求相对于当前的url。因此对于根 /,请求将指向 /test.js 并且会工作,但是当当前页面是 /route/1 时,请求将转到 /route/test.js 并且会失败。

直接解决方法是将 / 添加到 url,使路径成为绝对路径:

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

更可靠的解决方案是使用 url helper:

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

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