ActionView::Template::Error (960.css没有预编译)

22

我有一个 iframe,它会渲染一个 partial,并不是主应用程序布局或资源管道的一部分。

我想要包含一些样式表,但是遇到了以下错误:

 ActionView::Template::Error (960sm.css isn't precompiled):

Rails 3.1 Heroku

3个回答

41

如果样式表没有在清单中被包含(直接按名称或通过require_tree间接),那么它们将不会被预编译,因此在生产环境中无法访问。

您需要将该样式表添加到环境应用程序.rb中的预编译项目列表中。

config.assets.precompile += ['960sm.css']

然后在视图中访问它:

stylesheet_link_tag('960sm')

感谢您帮助我整理资产管道。 - hagope
3
功能正常,对我很有帮助,但是application.css中的描述给了另一个关于它如何工作的想法:.../*
  • 这是一个清单文件,它将自动包含此目录及其任何子目录中可用的所有样式表。
  • 您可以在此文件中添加应用程序范围的样式,它们将出现在编译后的文件顶部,
  • 但通常最好为每个样式作用域创建一个新的文件。 *= require_self *= require_tree . */
- Gedean Dias
这帮助了我...在寻找解决方案几个小时后。 - justcode
在更改所有必要的配置文件后,您必须运行touch YOURAPPDIR/tmp/restart.txt来刷新Passenger缓存。 - FouZ

4

不必管理一长串的CSS文件,你可以直接在文件名后面添加.scss扩展名来进行调整。

因此,960sm.css将变为960sm.css.scss

这样做不会破坏任何东西,因为有效的CSS也是有效的SCSS。


1
没问题,但请记住不要在预编译列表中添加.scss。"即使您想将Sass或CoffeeScript文件添加到预编译数组中,也始终指定一个预期的已编译文件名以.js或.css结尾。" - AlexChaffee

0
如果您有很多独立的资产,那么不要像这样将每个资产都添加到列表中:
config.assets.precompile += ['960sm.css']

你可能想要像这样预编译所有内容:

def precompile?(path)
  %w(app lib vendor).each do |asset_root|
    assets_path = Rails.root.join(asset_root, 'assets').to_path
    return true if path.starts_with?(assets_path)
  end
  false
end

# Precompile all assets under app/assets (unless they start with _)
Rails.application.config.assets.precompile << proc do |name, path|
  starts_with_underscore = name.split('/').last.starts_with?('_')
  unless starts_with_underscore
    path = Rails.application.assets.resolve(name).to_path unless path # Rails 4 passes path; Rails 3 doesn't
    precompile?(path)
  end
end

(基于Rails指南中的代码。)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接