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

Gaz*_*zza 6 ruby-on-rails asset-pipeline

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

stylesheet_link_tag params[:controller] 
Run Code Online (Sandbox Code Playgroud)

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']
Run Code Online (Sandbox Code Playgroud)

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

Ada*_*r86 6

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

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

config.assets.precompile += ["*.css", "*.js")
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

例如

config.assets.precompile += ['*.css', 'manifests/*.js']
Run Code Online (Sandbox Code Playgroud)

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

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

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

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