为什么Rails不会找到我的资产?

时间:2012-03-14 19:14:08

标签: asset-pipeline ruby-on-rails-3.2

在生产模式下,rails似乎无法从资产管道中找到任何预编译资产。

我在CentOS上使用RVM运行的rails 3.2.0和ruby 1.9.3。没有其他Web服务器与此应用程序一起运行。该应用程序最近才更新为使用资产管道,因为它最初是一个rails 3.0应用程序。

运行后

rake assets:clean
rake assets:precompile

正如我所料,我在公共/资产中看到了哈希内容。文件末尾的哈希值与我在页面源中看到的哈希值相匹配。

然而在运行时,这是我看到Rails尝试提供的每个资产的内容:

Started GET "/assets/application-892c6227e631daf9a8e041b1d4d002ec.css" for 75.149.58.169 at 2012-03-14 11:42:43 -0700

ActionController::RoutingError (No route matches [GET] "/assets/application-892c6227e631daf9a8e041b1d4d002ec.css"):

我不是指每个资产所在的文件夹;所有对资产的引用都是这样的:

//css:
.class {
  background: url(asset.png) no-repeat;
}

//erb:
<%= image_tag "asset.png" %>
<%= link_to "page", :class => "class" %>

production.rb中的资产管道相关设置:

config.serve_static_assets = false
config.assets.enabled = true
config.assets.compress = true
config.assets.debug = false
config.assets.compile = false
config.assets.digest = true

最后,来自config / application.rb的资产设置:

config.assets.enabled = true
config.assets.version = '1.0'

启动rails服务器进程的用户对公共/资产具有读,写和执行权限,因此我认为这不是权限问题。我错过了配置步骤吗?

修改

我注意到没有错误声明资产没有预编译,因此我尝试通过在主机路径的末尾添加“/assets/application-892c6227e631daf9a8e041b1d4d002ec.css”来从网页访问样式表:

http://www.myapp.com"/assets/application-892c6227e631daf9a8e041b1d4d002ec.css"

这很有效,样式表打开了。

2 个答案:

答案 0 :(得分:26)

进一步研究这个问题产生了这篇SO文章:

application.css not being served as an asset

似乎

config.serve_static_assets = false

只要我的Rails应用程序没有在Apache或nginx后面运行

,设置是否正确

答案 1 :(得分:4)

我有同样的问题,但我注意到你的样式表指向文件的非指纹,非缓存版本。如果您正在使用资产管道,为了利用它,您需要使用指向文档的指纹缓存版本的帮助程序。要做到这一点,您需要在您的css文件中嵌入erb,或者使用sass。

不正确:

.class {
  background: url(asset.png) no-repeat;
}

正确(使用sass):

.class
  background: image-url('asset.png') no-repeat

有关详细信息,请参阅此处:http://guides.rubyonrails.org/asset_pipeline.html#coding-links-to-assets

如果您不关心性能问题,那么在升级到Rails 4或Rails 3.2.16之前,您可以使用非缓存版本,因为这些版本会引入重大更改,迫使您使用资产管道(及其相应的语法)。如果您不使用新语法,则非缓存版本将无法在生产中使用。