Мне нравится решение Альбандигера. С помощью которого я обнаружил, что активы javascript/coffeescript не предварительно компилируются индивидуально. Что вызывает всевозможные ошибки при попытке использовать javascript_path
. Я поделюсь своим решением этой проблемы после того, как решу проблему, которую несколько человек упомянули в своих комментариях. В основном имеет дело только с частичным набором файлов контроллера с именами JavaScript.
Поэтому я создал помощник приложения, чтобы определить, существует ли файл в каталоге javascript независимо от расширения .coffee/.js:
module ApplicationHelper
def javascript_asset_path(basename)
Sprockets::Rails::Helper.assets.paths.select{|i|
i =~ /javascript/ and i =~ /#{Rails.root}/
}.each do |directory|
if Dir.entries(directory).map {|i| i.split('.')[0]}.compact.
include? basename
return File.join(directory, basename)
end
end
nil
end
end
Этот метод вернет полный путь к файлу javascript, если он существует. В противном случае он возвращает ноль. Итак, следуя комментарию Pencilcheck, вы можете добавить этот метод для условного включения:
<%= javascript_include_tag(controller_name) if javascript_asset_path(controller_name) %>
И теперь у вас есть правильное условное включение. Теперь к вопросу о предварительно скомпилированных ассетах. Как правило, для оптимизации не требуется предварительная компиляция ресурсов по отдельности. Однако вы можете сделать это, если вам необходимо:
# Live Compilation
config.assets.compile = true
Вы можете добавить это в файл конфигурации вашей среды. Сначала протестируйте его в файле среды разработки. Опять же, это нецелесообразно. Конвейер ресурсов Rails использует Sprockets для оптимизации всего:
Sprockets загружает указанные файлы, при необходимости обрабатывает их, объединяет в один файл и затем сжимает (если Rails.application.config.assets.compress имеет значение true). Отдавая один файл, а не несколько, можно значительно сократить время загрузки страниц, поскольку браузер делает меньше запросов. Сжатие также уменьшает размер файлов, позволяя браузеру загружать их быстрее.
ПОЖАЛУЙСТА, ПРОЧТИТЕ документацию для получения дополнительной информации о механике http://guides.rubyonrails.org/asset_pipeline.html
Активы не компилируются индивидуально. Например, когда я пытаюсь:
<%= javascript_include_tag 'event' %>
Я получил:
Sprockets::Rails::Helper::AssetFilteredError: Ассет отфильтрован и не будет обслуживаться: добавьте Rails.application.config.assets.precompile +=
%w( event.js )
к config/initializers/assets.rb
и перезапустите сервер
Таким образом, вы можете указать, какие активы должны быть предварительно скомпилированы по отдельности. Нам просто нужно добавить соответствующий контроллер с именем javascript files в наш инициализатор ресурсов. Ну, мы можем сделать это программно.
Чтобы получить список имен контроллеров, я буду использовать пример ecoologic:
all_controllers = Dir[
Rails.root.join('app/controllers/*_controller.rb')
].map { |path|
path.match(/(\w+)_controller.rb/); $1
}.compact
И теперь, чтобы получить имя всех файлов javascript, которые соответствуют базовому имени имени контроллера, вы можете использовать следующее:
javascripts_of_controllers = Sprockets::Rails::Helper.assets.paths.select{|a_path|
a_path =~ /javascript/ and a_path =~ /#{Rails.root}/
}.map {|a_path|
Dir.entries(a_path)
}.flatten.delete_if {|the_file|
!the_file['.js']
}.collect {|the_file|
the_file if all_controllers.any? {|a_controller| the_file[a_controller]}
}
Тогда вы можете попробовать:
# config/initializers/assets.rb
Rails.application.config.assets.precompile += javascripts_of_controllers
Это даст вам список всех файлов javascript без пути к каталогу, которые соответствуют имени вашего контроллера. Обратите внимание, что если имя вашего контроллера во множественном числе, имя javascript также должно быть множественным. Также обратите внимание, если контроллер в единственном числе, а файл javascript во множественном числе, он все равно будет включать его, потому что the_file[a_controller]
будет успешным при частичном совпадении.
Не стесняйтесь попробовать это в настройках Rails.application.config.assets.precompile
. Я знаю, что это правильно дает вам список файлов. Но я оставлю вас, чтобы проверить это. Дайте мне знать, если есть какие-либо нюансы, связанные с предварительной компиляцией таким образом, поскольку мне любопытно.
Очень подробное объяснение того, как выполняется предварительная компиляция ресурсов, см. в этом блоге: http://www.sitepoint.com/asset-precompile-works-part/
person
6ft Dan
schedule
05.11.2014