我正在使用资产管道(在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.css
与stylesheet_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 /目录。
有什么想法吗?
答案 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
。