Мне нравится Решение albandiguer . Я обнаружил, что ресурсы 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/