1

作为一段前置文本,我习惯于Rails 2,但开始构建一个示例应用程序以适应Rails 4,并且我正在与Sprockets和资产管道进行恶梦即使在阅读官方指南和我能找到的所有问题之后。如何正确使用链轮Gem with Rails 4

我的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中提及。

我没有require s在application.js中设置。

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

我读了一些与sprocket-rails gem version 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) 

回答

2

链轮想要的一切压缩成一个文件,然后再缩小,所以通常的模式是,包括在应用程序清单所有你的JavaScript /样式表。这种模式有plenty of good reasons

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

链轮相对脆弱,与之抗争是一场艰苦的战斗。所以在这两种情况下(JS/CSS),你都应该包含它们,并使用足够聪明的选择器来将页面特定的样式或JS范围设置为,即页面

这就是说,有时我们无法避免从全局包含中遗漏某些资产。如果您需要从清单中排除特定文件,请使用stub directive,并将其与HTML标记助手分开包含。

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

stubrequire指令和附加清单的组合应该足够灵活,可以按照自己的喜好组织资产并添加其他资产。

+0

哇,感谢您的深入解答,这无疑帮助我更多地理解了这一点,并明确了下一步要读的内容。 – martincarlin87