Rails3资产管道:控制器特定的样式表

时间:2012-07-18 14:38:37

标签: ruby-on-rails asset-pipeline

关于资产管道的主题,Rails指南建议Rails只需通过调用即可链接到控制器特定的CSS文件:

stylesheet_link_tag params[:controller] 

Rails指南的摘录:

  

例如,如果您生成ProjectsController,Rails还将在app / assets / javascripts / projects.js.coffee中添加一个新文件,在app / assets / stylesheets / projects.css.scss中添加另一个文件。您应该将任何JavaScript或CSS唯一的控件放入其各自的资产文件中,因为这些文件可以仅为这些控制器加载,例如<%= javascript_include_tag params [:controller]%>或<%= stylesheet_link_tag params [:controller]%>。   http://guides.rubyonrails.org/asset_pipeline.html#how-to-use-the-asset-pipeline

这在我们允许Rails回归资产管道的开发中运行得很好。但是,在生产中,我收到一个错误,说样式表没有预编译。

根据我的阅读,您必须将要显示为独立文件的任何资产添加到预编译数组中,如下所示:

config.assets.precompile += ['admin.js', 'admin.css', 'swfObject.js']

如果我想要按照上面的Rails指南示例链接的控制器特定样式表,我是否必须枚举预编译数组中的每一个?

1 个答案:

答案 0 :(得分:6)

简短的回答是......是的。

但请记住,资产管道也可用于匹配选择器。我为一个简单的cms实现了类似的设置,我知道我希望每个控制器都有自己的.css和.js。配置看起来像......

config.assets.precompile += ["*.css", "*.js")

如果你有许多与控制器没有直接关系的样式表或脚本,那么这不是最好的解决方案。在我的情况下,每个控制器都需要非常不同的.js文件。

此外,如果您的不同资产可以分为两个或三个相互关联的组,您可以考虑创建多个清单,然后明确列出它们。

修改 我想为那些试图决定如何设置资产预编译的人提供这个答案。

除了显式预编译每个资产或清单外,您还可以将您想要预先发布的所有文件放入资源文件夹中的文件夹中,并使用相同的通配符匹配来仅编译这些资产。

例如

config.assets.precompile += ['*.css', 'manifests/*.js']

将编译清单文件夹中的所有css表和仅.js文件。

同样,您可以传递assets.precomile正则表达式。因此,如果您想将“pre_”附加到您想要预先发布的任何文件,您可以使用匹配... ...

config.assets.precompile += [/^pre_\w*.(css|js)/i]

可能性是无穷无尽的,只是不要觉得你必须满足于预编译所有资产,这可能是无用的吞噬,因为大多数脚本和css应该编写为在多个实例中使用并与其他脚本一起使用,或者抛出一切,甚至高度专业化的脚本到应用程序。*。