ruby-on-rails - 将页面特定的CSS添加到Rails Asset Pipeline

标签 ruby-on-rails asset-pipeline

这是几个人以前问过的一个问题,但是没有一个问题被我认为有帮助的方式问到或回答过,所以我写的是我认为有帮助的问题和答案。



我有一个使用资产管道的Rails 3.1+应用程序。我想使用一种不同的CSS,这是一个特定的动作。 (在我的特定情况下,我打算打印一个页面,因此它确实需要完全不同的CSS,并且不需要任何Javascript。)当前,我只有一个特定于应用程序的CSS文件。如何添加新的CSS文件并引导资产管道使用我的文件?

例如,现在,我的app/assets看起来像

app/assets
    /javascript
        application.js
        custom.js.coffee
    /css
        application.css
        custom.css.scss


我想添加一个特定动作的视图使用的print.css文件。此视图将不使用application.css文件。如何添加print.css

最佳答案

我发现此博客文章非常有帮助:http://blog.seancarpenter.net/2012/11/05/page-specific-javascript-with-the-asset-pipeline/。我的回答解释了这位博客作者已经写过的内容,并填补了一些遗漏的细节。



首先,您必须阅读并理解the Rails Guide to the Asset Pipeline,这一点很重要。不幸的是,本指南并未明确说明如何添加特定于操作的资产,但确实涵盖了您需要了解的一些概念。确保您了解以下想法:


资产管道可以编译Javascript,CSS和其他资产,以便Rails服务器可以缓存资产以获得更好的性能。
该清单文件使用requirerequire_treerequire_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.jsprint.js不共享任何资产,则可以在stub中使用application.js命令排除在print.js中使用的资产。这将指示application.js从其自己的引用文件列表中删除print.js引用的任何资产。我们修改后的application.js看起来像:



(截图...)
require_tree。
存根打印


有关更多信息,请参见this answer


如果print.jsapplication.js文件共享某些资产,则需要将application.js使用的所有资产移到子目录中。我自己没有这样做,所以在这方面我不是最大的帮助。请参阅this answer以获取指示。




现在,我们在资产管道中包含了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文件使用此新布局。根据需要进行设置。对于打算打印的页面,这可能非常简单,例如



<头>
<br> </ head><br> <身体><br> <%=收率%><br> </ body><br></ html><br><br><br>使用单独的布局有一个缺点,即很难使此布局与应用程序其余部分使用的布局保持同步,但是如果您对操作使用单独的CSS文件,则无论如何都不太希望布局相同。<br><br><br>在布局的标题中添加一个<code>stylesheet_link_tag</code>指向您的<code>print.css</code>:<br><br><br><html><br> <头><br> <title =“打印” /><br> <%= stylesheet_link_tag“打印”%><br> </ head><br> <身体><br> <%=收率%><br> </ body><br></ html><br><br><br><br>在控制器中,我们将告诉Rails使用新布局进行操作。将行<code>layout 'print', only: [:print_reports]</code>添加到您的控制器:<br><br><br>class report_controller <ApplicationController<br> 版式'print',仅:[:print_reports]<br><br> #snip<br><br><br>有关更多信息和几种不同的方法,请参见<a href="https://stackoverflow.com/q/3025784/473792" rel="noreferrer noopener nofollow">this question</a>。<br><br>此时,当您运行应用程序时,您的<code>print_reports</code>操作应正确​​使用<code>print.css</code>!<br><br><br><br>在服务器上进行部署之前,请记住先运行<code>rake assets:precompile</code>。</p> </div> <div style="margin-top: 20px; margin-bottom: 40px;"> <p style="font-size: 20px;">关于ruby-on-rails - 将页面特定的CSS添加到Rails Asset Pipeline,我们在Stack Overflow上找到一个类似的问题: <a href="https://stackoverflow.com/questions/27206835/" rel="noreferrer noopener nofollow" style="color: red;"> https://stackoverflow.com/questions/27206835/ </a> </p> </div> </div> <div class="text-center" style="margin-top: 40px;"> <h3 style="font-size: 18px;"> <span>上一篇:<a href="/article/6548707" title="google-chrome - chrome 隐身模式缓存是存储在磁盘还是内存中,是否加密?">google-chrome - chrome 隐身模式缓存是存储在磁盘还是内存中,是否加密?</a></span> </h3> <h3 style="font-size: 18px;"> <span>下一篇:<a href="/article/6548709" title="angularjs - $setPristine() 不工作。">angularjs - $setPristine() 不工作。</a></span> </h3> </div> </div> <div style="width: 100%; margin-top: 30px;"> <p> <font style="font-size: 20px;"><strong>相关文章:</strong></font> </p> <p style="margin: 0 auto; margin-top: 5px;"> <a href="/article/8463927" title="ruby-on-rails - Spree 可以允许我在我的电子商务应用程序中包含 'Vendors' 吗?">ruby-on-rails - Spree 可以允许我在我的电子商务应用程序中包含 'Vendors' 吗?</a> </p> <p style="margin: 0 auto; margin-top: 5px;"> <a href="/article/1114769" title="ruby-on-rails - Github 警告有关 Omniauth gem 的安全问题">ruby-on-rails - Github 警告有关 Omniauth gem 的安全问题</a> </p> <p style="margin: 0 auto; margin-top: 5px;"> <a href="/article/6745174" title="ruby-on-rails - 如何在 Heroku 上的 Rails 应用程序上完全关闭 Assets 编译?">ruby-on-rails - 如何在 Heroku 上的 Rails 应用程序上完全关闭 Assets 编译?</a> </p> <p style="margin: 0 auto; margin-top: 5px;"> <a href="/article/6528578" title="ruby-on-rails-3.1 - ruby on rails 3.1 将 .swf 移动到 Assets 管道?">ruby-on-rails-3.1 - ruby on rails 3.1 将 .swf 移动到 Assets 管道?</a> </p> <p style="margin: 0 auto; margin-top: 5px;"> <a href="/article/6437995" title="ruby-on-rails-3 - 如何使我的 LESS 变量可用于 Rails 中的所有 CSS 文件?">ruby-on-rails-3 - 如何使我的 LESS 变量可用于 Rails 中的所有 CSS 文件?</a> </p> <p style="margin: 0 auto; margin-top: 5px;"> <a href="/article/6653863" title="ruby-on-rails - 为什么我应该使用 Asset Pipeline 来提供图像?">ruby-on-rails - 为什么我应该使用 Asset Pipeline 来提供图像?</a> </p> <p style="margin: 0 auto; margin-top: 5px;"> <a href="/article/1855376" title="javascript - 带有嵌入式 Ruby 代码的 JavaScript 应该放在 Rails 3.1 应用程序的什么位置?">javascript - 带有嵌入式 Ruby 代码的 JavaScript 应该放在 Rails 3.1 应用程序的什么位置?</a> </p> <p style="margin: 0 auto; margin-top: 5px;"> <a href="/article/1110921" title="javascript - Ruby on Rails 4 和 asset_path 的用法">javascript - Ruby on Rails 4 和 asset_path 的用法</a> </p> <p style="margin: 0 auto; margin-top: 5px;"> <a href="/article/6737237" title="ruby-on-rails - rspec 中的 i18n 翻译">ruby-on-rails - rspec 中的 i18n 翻译</a> </p> <p style="margin: 0 auto; margin-top: 5px;"> <a href="/article/2606771" title="ruby-on-rails - PostgreSQL + rails : is it possible to have a write-only database user in PG?">ruby-on-rails - PostgreSQL + rails : is it possible to have a write-only database user in PG?</a> </p> </div> </div> </div> <div class="footer text-center" style="float: left; width: 100%; margin-top: 40px;"> <p> <font color="gray">©2024 </font><a href="/"><font color="gray">IT工具网</font></a>  <a href="/article/7294988" rel="nofollow"><font color="gray">联系我们</font></a> </p> </div> <script> var _hmt = _hmt || []; (function() { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?d26f2298d3a7fe583e547d2101e22936"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })(); </script> <script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-6220481272339728" crossorigin="anonymous"></script> <script type="text/javascript" src="https://cdn.staticfile.org/jquery/3.4.1/jquery.min.js"></script> <script type="text/javascript" src="https://cdn.staticfile.org/twitter-bootstrap/4.3.1/js/bootstrap.min.js"></script> <script type="text/javascript" src="/static/js/highlight-10.1.2.min.js"></script> <script>hljs.initHighlightingOnLoad();</script> <script type="text/javascript"> $("code").each(function(){ var codeHTML = $(this).prop("innerHTML"); var newCodeHTML = codeHTML.replace(new RegExp("</.*>", "g"), ""); newCodeHTML = newCodeHTML.replace(new RegExp("<", "g"), "<"); $(this).html(newCodeHTML); }) </script> </body> </html>