Как правильно использовать Gem Sprockets с Rails 4
Как предварительный текст, я привык к Rails 2, но начал создавать пример приложения, чтобы привыкнуть к Rails 4, и у меня кошмар со Sprockets и конвейером ресурсов даже после прочтения официального руководства и каждого вопроса, который я могу найти на ТАК.
Мои 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_tag
а также javascript_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
установлен в application.js
,
TLDR Я думаю, что использую Sprockets и Asset Pipeline неправильно, может кто-нибудь указать, что я делаю неправильно, и указать мне правильное направление?
Я читал о некоторых похожих проблемах, связанных с версией gem sprocket-rails 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)
1 ответ
Sprockets хочет сжать все в один файл и минимизировать его, поэтому обычно шаблон включает в себя все ваши javascript/ таблицы стилей в манифестах приложения. Есть много веских причин для этого шаблона.
Так как кажется, вы удалили = require_tree .
строк, это не происходит автоматически, и поэтому Rails хочет знать о каждом отдельном файле, который вы планируете включить отдельно через assets.precompile
Вариант конфигурации. Если требуется, чтобы весь каталог был слишком агрессивным, разбейте свои активы на подпапки и более четко укажите, что вы хотите включить.
Звездочки относительно хрупкие, и борьба с ними - тяжелая битва. Таким образом, в обоих случаях (JS/CSS) вы должны включить все это и использовать селекторы, которые достаточно умны, чтобы охватить специфичные для страницы стили или JS для этой страницы.
Тем не менее, иногда мы не можем избежать исключения определенных активов из глобального включения. Если вам нужно исключить конкретный файл из манифеста, используйте директиву-заглушку и включите ее отдельно в помощники тегов HTML.
Также обратите внимание, что вы можете иметь дополнительные манифесты (другие файлы, которые включают = require ...
свои собственные директивы) ... пока вы добавляете их в assets.precompile
список.
Сочетание stub
а также require
директивы и дополнительные манифесты должны дать вам достаточно гибкости, чтобы организовать ваши активы по своему вкусу и сделать добавление дополнительных активов без трения.