如何正确使用链轮 Gem Rails 4

How to Use Sprockets Gem Properly with Rails 4

作为前言,我已经习惯了 Rails 2,但开始构建示例应用程序以适应 Rails 4,我对 Sprockets 和资产做了一场噩梦即使在阅读了官方指南和我能在 SO 上找到的每个问题后,管道仍然存在。

我的 css 和 js 像这样包含在我的主视图文件中:

<head>
   ...
  <%= stylesheet_link_tag "application", media: "all" %>
  <%= stylesheet_link_tag "style-responsive", media: "all" %>

  <%= stylesheet_link_tag params[:controller], :media => "all" if stylesheet_exists?(params[:controller]) %>

  <!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries -->
  <!--[if lt IE 9]>
  <%= javascript_include_tag 'html5shiv' %>
  <%= javascript_include_tag 'respond.min' %>
  <![endif]-->
  ...
</head>

....

<%= javascript_include_tag "jquery-1.10.2.min" %>
<%= javascript_include_tag "jquery-ui-1.9.2.custom.min" %>
<%= javascript_include_tag "jquery-migrate-1.2.1.min" %>
<%= javascript_include_tag "bootstrap.min" %>
<%= javascript_include_tag "modernizr.min" %>

<%= javascript_include_tag params[:controller] if javascript_exists?(params[:controller]) %>

stylesheet_exists?javascript_exists? 是辅助函数,因为我只想在需要时包含某些文件,而不是每个页面都需要的其余文件。

第一个错误是:

Asset filtered out and will not be served: add `Rails.application.config.assets.precompile += %w( style-responsive.css )` to `config/initializers/assets.rb` and restart your server

如果我随后将其添加到 assets.rb 并重新启动,它将继续,并且在我看来每个 stylesheet_link_tagjavascript_include_tag 都会重复该问题。

我可以接受,即使它看起来不对,但当解释器到达时,它就会崩溃

<%= javascript_include_tag params[:controller] %>

然后我还需要包括我为每个控制器创建的每个 js 文件吗?每当我创建新资产文件时,我都必须不断更新文件,这似乎是错误的。

在我的application.css.erb我只有

 *= require_self.

但我确实有一些样式表的老式 CSS @import:

@import url(http://fonts.googleapis.com/css?family=Open+Sans:400,300,300italic,400italic,600,600italic,700,700italic,800,800italic);
@import url('bootstrap.min.css');
@import url('bootstrap-reset.css');
@import url('jquery-ui-1.10.3.css');
@import url('<%= asset_path 'css/font-awesome.min.css' %>');
@import url('custom-ico-fonts.css');

但所有这些似乎都工作正常,不需要在 assets.rb 中提及。

我在 application.js 中没有设置 require

TLDR 我想我错误地使用了 Sprockets 和 Asset Pipeline,有人可以指出我做错了什么并指出正确的方向吗?

我读到了与 sprocket-rails gem 2.2.3 版有关的一些类似问题,但我安装了 2.2.4,这意味着修复了以前的版本。

Rails 4.2.1
ruby 2.1.0p0 (2013-12-25 revision 44422) [x86_64-linux]
sprockets (3.0.1, 2.12.3)
sprockets-rails (2.2.4)

Sprockets 希望将所有内容压缩到一个文件中并将其缩小,因此通常的模式是在应用程序清单中包含 all your javascript/stylesheets。此模式有 plenty of good reasons 个。

由于您似乎已经删除了 = require_tree . 行,这不会自动发生,因此 Rails 想知道您计划通过 assets.precompile 单独包含的每个文件配置选项。如果要求整个目录过于激进,请将您的资产分成子文件夹,并更明确地说明您想要包含的内容。

Sprockets 比较脆弱,对抗它是一场艰苦的战斗。所以在这两种情况下(JS/CSS),你应该全部包含它并使用足够聪明的选择器来将页面特定的样式或 JS 范围限定到那个页面 .

也就是说,有时我们无法避免将某些资产排除在全球包容性之外。如果您需要从清单中排除特定文件,请使用 stub directive 并将其与 HTML 标签助手分开包含。

另请注意,您可以有其他清单(其他文件包含自己的 = require ... 指令)...只要将它们添加到 assets.precompile 列表即可。

stubrequire 指令以及额外清单的组合应该给你足够的灵活性来组织你的资产到你的喜好,并使添加额外的资产变得顺畅。