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