Rails 3.1资产管道在生产中

时间:2012-01-06 15:42:47

标签: ruby-on-rails-3.1 asset-pipeline production

我正在使用资产管道(在Rails 3.1.3中)并且正在努力使其在生产中工作。

情况

在我的/app/assets/stylesheets目录中,我有以下文件:

application.css --> this is the default rails one
stylesheet.css --> This is my custom stylesheet

我花了很多时间将我的stylesheet.css包含在生产中的/public/assets/目录中(通过运行rake assets:precompile),我最后通过在我的{中添加以下行来实现它{1}}档案:

application.rb

我知道生产中有正确的预编译 config.assets.precompile += ['stylesheet.css'] 文件。

我的问题

我遇到的问题是将stylesheet.cssstylesheet_link_tag文件一起使用时。事实证明:

stylesheet.css已解析为生产中的<%= stylesheet_link_tag "stylesheet" %> 我希望将路径解析为<link href="/stylesheets/stylesheet.css" media="screen" rel="stylesheet" type="text/css"> ,就像在开发中一样

更令人惊讶的是,即使/assets/stylesheet.css解析为application.css<%= stylesheet_link_tag "application"%>仍然表现得很完美。我不明白的是,rails 3.1中不存在public / stylesheets /目录。

有什么想法吗?

4 个答案:

答案 0 :(得分:8)

理查德·赫尔斯的回答指出了我正确的方向。发生的事情真的很微妙..

我的问题的答案是Rails 3.1 assets has no fingerprint in production

基本上,我的项目使用mongoid而不是ActiveRecord。根据Mongoid documentation关于配置,application.rb文件可以修改为不包括ActiveRecord,这意味着删除:

require railties/all

将其替换为:

require "action_controller/railtie"
require "action_mailer/railtie"
require "active_resource/railtie"
require "rails/test_unit/railtie"
# require "sprockets/railtie" # Uncomment this line for Rails 3.1+

我习惯使用rails 3.0.x进行此操作,但我没注意与Rails 3.1相关的注释

我的问题是我不需要链轮!

谢谢大家的帮助!

答案 1 :(得分:7)

您可以在开发中访问stylesheet.css的原因是Sprockets的工作方式。

在开发模式下,对/ assets下的所有内容的所有请求都将发送到Sprockets进行处理。链接将直接将请求映射到路径,一对一,因此您可以访问存储在app/assets/etc中的任何资产。

所有请求都通过通过 Sprockets;它将文件提供给您的浏览器。

在生产中,事情是不同的。指纹被添加到文件名中,期望您将资产预编译为静态文件。这是出于性能原因 - Sprockets不够快,无法满足大量请求。

只有默认清单引用的CSS和JS文件才会被编译到application.css和application.js中。您引用的其他文件不会预编译,除非它们被添加到配置文件中的config.assets.precompile数组中。

您说文件已解析为/stylesheets/stylesheet.css。管道应该在开发中生成这样的路径:/assets/applicaton.css。在生产中,应该是文件名中的指纹。您发布的内容表明管道未启用(这些是旧的3.1之前的文件位置)。

如果这是升级后的应用,很可能您错过了一些重要的配置选项。这是开发生产问题的主要原因。检查管道选项是否设置为完全,因为它们位于管道指南的last section中。 (我的猜测是你在application.rb中缺少config.assets.enabled = true

为清楚起见,我建议将stylesheet.css的名称更改为admin.css,同时将其包含在预编译数组中(正如您已经完成的那样)。

如果配置选项设置正确,并且您的管理清单包含在预编译中,则应该为前端提供application.css,为后端提供admin.css,这两种方法都可以通过帮助方法进行链接。

答案 2 :(得分:1)

application.css应该是一个清单文件,这意味着您在运行程序时应自动包含stylesheet.css

确保它有这两行。

application.css:

/*
 *= require_self
 *= require_tree . 
*/

如果确实如此,则其他内容无法正常工作,您不需要该行:

config.assets.precompile += ['stylesheet.css']

如果不起作用,请确保您已通过此Asset Pipeline指南启用了所有设置。

答案 3 :(得分:0)

当我环顾actionpack以查看可能导致此问题的原因时,我在3.1.1更改日志中找到了这个小宝石:

javascript_path and stylesheet_path now refer to /assets if asset pipelining is on.

Soooo,如果你正在使用3.1.0升级到3.1.1,看看它是否修复了它。如果你已经升级了,那就回到原点了。但它似乎确实描述了您的问题,因为stylesheet_link_tag在整体上使用stylesheet_path