Мені подобається рішення 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) %>
І тепер у вас є належне умовне включення. Тепер щодо випуску попередньо складених активів. Як правило, для оптимізації ви не хочете, щоб активи, попередньо скомпільовані . Однак ви можете зробити це, якщо потрібно:
config.assets.compile = true
Ви можете додати це, щоб зробити файл конфігурації вашого середовища. Спершу протестуйте його у своєму файлі середовища розробки. Знову ж це недоцільно. Конвеєр активів Rails використовує зірочки для оптимізації всього:
Зірочки завантажує вказані файли, обробляє їх, якщо це необхідно, об'єднує в один файл, а потім стискає (якщо значення Rails.application.config.assets.compress є). Обслуговуючи один файл, а не багато, час завантаження сторінок можна значно скоротити, оскільки браузер робить менше запитів. Стиснення також зменшує розмір файлу, дозволяючи браузеру швидше завантажувати їх.
БУДЬ ЛАСКА, ПРОЧИТАЙТЕ документацію для отримання детальної інформації про механіку зірочок (трубопровід активів) http://guides.rubyonrails.org/asset_pipeline.html
Активи попередньо не складаються окремо. Наприклад, коли я намагаюся:
<%= javascript_include_tag 'event' %>
Я отримав:
Зірочки :: Рейки :: Helper :: AssetFilteredError: Asset відфільтрована і не буде обслуговуватися: надбудова 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]}
}
Тоді ви можете спробувати:
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/