2014-02-28 28 views
6

我明显必须在这里做错了事。我正在与资产管道搏斗(再次)。我有一个自定义字体,在我看来,让一切正常编译我需要在多个地方使用asset_path(),但它有一个意想不到的效果。Rails 4资产 - 生成两个不同的摘要

我知道有几种方法可以做到这一点,但这里是我目前:

application.css.scss.erb @import "<%= asset_path("my-font.css") %>";

my-font.css的源文件app/assets/stylesheets/my-font.css.erb(它需要一个.erb因为我那里也使用asset_path())。

application.rb我将my-font.css添加到预编译列表中。 config.assets.precompile << 'my-font.css'

当我清理public/assets和运行rake assets:precompile一切都得到编译,以消化,但消化应用到实际的文件是不一样的摘要计算,并把中application.css

得到的文件是 public/assets/my-font-2f25682a1ea904a866ef9f44101a5a2e.csspublic/assets/application-bba2edaee36771f4bdb5c89b8ec90aaf.css引用是: @import url(/assets/my-font-ed843d3b174ca427edf963e473ad9e9b.css);

我意识到我可能使用比我要asset_path()以上,又可以通过输入URL文件(),而不是要求他们,但这让我离工作最近。

我怀疑其中一个摘要正在my-font.css中计算之前它通过ERB和另一个之后,但我不明白为什么以及如何解决它。

对此提出建议?

+0

你可以使用'depend_on_asset'指令吗? http://stackoverflow.com/a/19688338/1066093 –

回答

6

我猜你只是通过清空public/assets来清理资产。这还不够,你还需要清空你的tmp/cache/assets,或者只是运行rake assets:clobber来做到这一点。

+0

OMG!你今天刚刚救了我的午休! – Nabheet

+0

谢谢先生,你也救了我的一天! – Sija

0

我已经通过将要捆绑的资产的原始内容注入像application.scss.erb这样的组合资产来解决这种依赖关系。你需要明确声明依赖(所以在my-fonts.css变化引起的application.css一个再生),然后注入的内容:

application.scss.erb

// Should be at Top of File 
//= depend_on_asset my-fonts.css 

//... wherever in the file you want the contents injected: 
<%= environment['my-fonts.css'] %> 

这是如何工作的?在资产流水线编译期间,此处的环境包含所有预编译资产内容的散列。这允许您将编译内容从my-fonts.css注入到您的复合资产中。由于我们手动注入值,我们需要明确创建一个依赖关系来通过depend_on_asset跟踪这种关系。

有一点需要记住的是,多个资产预处理器(SCSS,ERB等)是从“外部输入”处理的,因此my-fonts.css资产的内容将在ERB处理期间被编译/注入为CSS输出。它们将在SCSS处理之前包含在资产内。这不应该造成问题,因为如果这是SCSS资产,则任何SCSS引用都将在注入父资产之前编译。