将特定于页面的 CSS 添加到 Rails Asset Pipeline [英] Adding page-specific CSS to Rails Asset Pipeline
问题描述
这是一个之前有几个人问过的问题,但没有一个问题以我认为有用的方式提出或回答,所以我写了我认为有用的问题和答案.
<小时>我有一个使用资产管道的 Rails 3.1+ 应用程序.我希望使用不同的 CSS 执行一项特定操作.(在我的特定情况下,我有一个要打印的页面,因此它确实需要完全不同的 CSS 并且不需要任何 Javascript.)目前,我只有一个特定于应用程序的 CSS 文件.如何添加新的 CSS 文件并指示资产管道使用我的文件?
例如,现在,我的 app/assets
看起来像
应用程序/资产/javascript应用程序.jscustom.js.coffee/css应用程序.css自定义.css.scss
我想添加一个由特定操作的视图使用的 print.css
文件.此视图不会使用 application.css
文件.如何添加 print.css
?
我发现这篇博文非常有帮助:http://blog.seancarpenter.net/2012/11/05/page-specific-javascript-with-the-asset-pipeline/.我的回答转述了这位博主已经写过的内容,并补充了一些缺失的细节.
<小时>首先,您必须阅读并理解资产管道的 Rails 指南.不幸的是,本指南没有清楚地解释如何添加特定于操作的资产,但它确实涵盖了一些您需要了解的概念.确保您理解这些想法:
- 资产管道编译 Javascript、CSS 和其他资产,以便 Rails 服务器可以缓存资产以提高性能.
- 清单文件使用诸如
require
、require_tree
和require_self
之类的命令来指示将哪些文件编译在一起. - 为了使资产管道在生产中正常工作,您需要手动运行
rake assets:precompile
以在public
目录中生成已编译、缩小的资产.
这些想法是关于资产管道的最少需要知道"的信息.如果您还没有理解这些想法,那么您就没有专家或狂热者"级别的关于管道的知识,不幸的是,SO 不是学习这些东西的正确地方.幸运的是,The Rails Guide to the Asset Pipeline 只需 15 分钟即可阅读如果需要,可以快速上手.
<小时>其次,这些是您需要进行的更改,以确保资产管道正确查看和处理您的新 print.css
文件.
请按照以下步骤操作:
- 将您的
print.css
文件添加到app/assets/css
. - 您需要创建一个清单文件,该文件将显示 Rails 在哪里可以找到
print.css
.您需要这样做,即使您只添加了一个 CSS 文件.这是一个简单的步骤:- 将名为
print.js
的文件添加到app/assets/javascript
. - 将此行添加到
print.js
:
- 将名为
<前>//= 需要打印
这将是整个 print.js
文件中的唯一一行.如果我理解正确,Rails 期望清单文件具有文件扩展名 .js
,这就是我们不使用 print.css
作为清单文件的原因.
- 我们现在需要指示 Rails 查找和使用
print.js
清单.在您的config/application.rb
文件中添加以下行:
<前>config.assets.precompile += %w(print.js)
- 我们快完成了!但是,已经存在的
application.js
清单包含行//= require_tree .
这意味着它将包含您的print.css
文件.这将导致您的print.css
样式影响您的整个站点,而不仅仅是单个视图.有两种处理方法:- 如果
application.js
和print.js
不共享任何资源,您可以在您的应用程序中使用
以排除stub
命令.jsprint.js
中使用的资产.它的作用是指示application.js
从它自己的引用文件列表中删除print.js
引用的任何资产.我们修改后的application.js
看起来像:
- 如果
<前>(剪辑……)需要_树.存根打印
有关详细信息,请参阅此答案.
- 如果您的
print.js
和application.js
文件共享某些资产,则您需要移动application.js<使用的所有资产
进入子目录.我自己没有这样做,所以我不是这方面的最大帮助.查看此答案了解说明.
现在我们已经在资产管道中包含了 print.css
.我们现在需要让 Rails 在您的特定视图中使用 print.css
.
假设您的操作位于 reports
控制器中,并且该操作名为 print_reports
.这意味着我们有一个 reports_controller.rb
文件和一个 print_reports.html.erb
(或 .haml
)文件.我们需要对这些文件进行一些更改.
- 首先,在
app/views/layouts
中添加一个新布局.也许称之为print.html.erb
.我们将为您的print_reports.html.erb
文件使用这个新布局.按照您的意愿进行设置.对于要打印的页面,这可能非常简单,例如
<前><头><title="打印">头部><身体><%=产率%>