当使用sprockets时,Sinatra show view / example /:id为资产返回404错误

时间:2016-04-05 21:12:01

标签: ruby sinatra assets sprockets

当我访问时:

get "/example/:id" do
  ...
  slim :'example/show'
end

我收到此错误:

"GET /example/assets/app.css HTTP/1.1" 404
"GET /example/assets/app.js HTTP/1.1" 404

我怀疑:id可能会成为问题,因为 我的资产设置在我访问时有效:

get "/example" do
  ...
  slim :'example/index'
end

工作的:

"GET /assets/app.css HTTP/1.1" 304
"GET /assets/app.js HTTP/1.1" 200 

我的链轮设置:

class App < Sinatra::Base
  set :environment, Sprockets::Environment.new

  environment.append_path "assets/stylesheets"
  environment.append_path "assets/javascripts"

  environment.js_compressor  = :uglify
  environment.css_compressor = :scss

  get "/assets/*" do
    env["PATH_INFO"].sub!("/assets", "")
    settings.environment.call(env)
  end

  ...

end

我的完整回购但没有上次更改:https://github.com/aneta-bielska/home-for-paws-app

1 个答案:

答案 0 :(得分:1)

在您的布局中,您有以下行,用于定义资产的链接:

link rel="stylesheet" href="assets/app.css"
script src="assets/app.js"

由于这些元素中的url不是以斜杠开头,因此浏览器会将它们视为相对于它们出现的页面。这意味着当您访问/example时,链接会转到/assets/app.cs/assets/app.js。但是,当您转到例如example/1时,链接会被视为相对于1,因此浏览器会尝试获取/example/assets/app.cs(类似于app.js)。

您需要确保始终将这些链接视为绝对链接。最简单的方法是在开头添加/

link rel="stylesheet" href="/assets/app.css"
script src="/assets/app.js"

更强大的解决方案可能是使用Sinatra’s url helper来确保您始终创建正确的链接,因为它会将应用程序安装在服务器上的不同路径上:

link rel="stylesheet" href=url("/assets/app.css")
script src=url("/assets/app.js")