我正在使用资产管道(在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
),最后通过在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
。
更令人惊讶的是,即使<%= stylesheet_link_tag "application"%>
解析为<link href="/stylesheets/stylesheet.css" media="screen" rel="stylesheet" type="text/css">
, application.css
表现完美。 <link href="/stylesheets/stylesheet.css" media="screen" rel="stylesheet" type="text/css">
。 我不明白的是rails 3.1中不存在public / stylesheets /目录。
任何想法 ?
理查德·赫尔斯的回答向我指出了正确的方向。 发生的事情真的很微妙......
我的问题的答案是Rails 3.1资产在生产中没有指纹 。
基本上,我的项目使用mongoid而不是ActiveRecord。 根据有关配置的Mongoid 文档 ,可以修改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相关的注释
我的问题是我不需要链轮!
谢谢大家的帮助 !
您可以在开发中访问stylesheet.css
的原因是Sprockets的工作原理。
在开发模式下,对/ assets下的任何内容的所有请求都将发送到Sprockets进行处理。 Sprockets将直接将请求映射到路径,一对一,因此您可以访问存储在app/assets/etc
任何资产。
所有请求都通过 Sprockets; 它将文件提供给您的浏览器。
在生产中,事情是不同的。 指纹被添加到文件名中,期望您将资产预编译为静态文件。 这是出于性能原因 - Sprockets不够快,无法满足大量请求。
只有默认清单引用的CSS和JS文件才会被编译到application.css和application.js中。 您引用的其他文件不会预编译,除非它们被添加到配置文件中的config.assets.precompile
数组中。
你说文件解析为/stylesheets/stylesheet.css
。 管道应该在开发中生成这样的路径: /assets/applicaton.css
。 在生产中,文件名中应该有指纹。 您发布的内容表明管道未启用(这些是旧的,3.1之前的文件位置)。
如果这是一个升级的应用程序,很可能你错过了一些关键的配置选项。 这是开发生产问题的主要原因。 检查管道选项的设置是否与管道指南的最后一部分 完全相同 。 (我的猜测是你在application.rb中缺少config.assets.enabled = true
)
为清楚起见,我建议将stylesheet.css
的名称更改为admin.css
,同时将其包含在预编译数组中(如您所做)。
如果配置选项设置正确,并且您的管理清单包含在预编译中,则应该为前端提供application.css,为后端提供admin.css,这两种方法都可以通过帮助方法进行链接。
application.css
应该是一个清单文件,这意味着当您运行程序时,它应该自动包含stylesheet.css
。
确保它有这两行。
application.css:
/*
*= require_self
*= require_tree .
*/
如果它确实那么其他东西不能正常工作,你不应该需要这条线:
config.assets.precompile += ['stylesheet.css']
如果这不起作用,请确保您已从此资产管道指南中启用了所有设置。
当我环顾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
。