为啥 Rails 找不到我的资产?

Posted

技术标签:

【中文标题】为啥 Rails 找不到我的资产?【英文标题】:Why won't Rails find my assets?为什么 Rails 找不到我的资产? 【发布时间】:2012-03-14 19:14:08 【问题描述】:

在生产模式下,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"

这有效并且样式表打开了。

【问题讨论】:

相关/重复:***.com/questions/5760661/rails-favicon-ico-not-found 【参考方案1】:

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

application.css not being served as an asset

好像

config.serve_static_assets = false

只要我的 Rails 应用程序没有在 Apache 或 nginx 后面运行,这就是不正确的设置

【讨论】:

我被这个抓住了。通常使用 Apache,但这次是通过 IIS 使用 Thin。谢谢!【参考方案2】:

我遇到了同样的问题,但我注意到您的样式表指向文件的非指纹、非缓存版本。如果您正在使用资产管道,为了利用它,您需要使用指向文件的指纹缓存版本的帮助程序。为此,您需要将 erb 嵌入到您的 css 文件中,或者使用 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 之前使用非缓存版本,因为这些版本引入了强制您使用资产的重大更改管道(及其相应的语法)。如果您不使用新语法,非缓存版本将根本无法在生产环境中使用。

【讨论】:

嘿,谢谢!然而,自从发布了这个问题后,我们最终将资产迁移到了 CDN,但我会在以后的 Rails 项目中记住这一点!

以上是关于为啥 Rails 找不到我的资产?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Rails 找不到我的 jbuilder 模板或不渲染它?

Rails 3 在子目录中运行,找不到资产

rails - 在生产模式下找不到 application.css 资产

rails 应用程序在 heroku 上找不到 fontawesome 图标

在我的资产上发现“找不到资产的文件或变体”错误

AndroidLauncher 找不到资产,但 DesktopLauncher 可以