Rails 3.1: javascripts не поддерживается правильно из каталога vendor/assets?
Я организовал файлы javascript в нескольких каталогах, и я обнаружил следующее странное поведение. Учитывая следующее дерево:
+ app
+ assets
+ javascripts
+ common
+ public
+ common
+ home
- home.js
home.js
выглядит следующим образом:
//= require jquery
//= require jquery_ujs
//= require jquery-ui
//= require_directory ../../jquery_plugins
//= require_directory ../../common
//= require_directory ../common
//= require_self
Теперь трюк лежит в каталоге jquery_plugins
. Я разместил его внутри vendor/assets/javascripts
(который включен в путь загрузки ресурса, когда я проверяю Rails.application.config.assets.paths
). Когда я это сделаю, я получаю сообщение об ошибке: require_tree argument must be a directory
. Когда я перемещаю этот каталог на app/assets/javascripts
, тогда все работает.
Кто-нибудь знает, что я делаю неправильно? Или это ошибка?
Ответы
Ответ 1
Вы можете добавить файл манифеста в каталог, который вы пытаетесь подавать, с чем-то вроде
vendor/assets/javascripts/jquery_plugins/manifest.js
//= require_directory .
и потребовать его в app/assets/javascripts/application.js
через
//= require jquery_plugins/manifest
Изменить (еще проще)
Благодаря @LeEnno для этого
Фактически вы можете поместить все отдельные файлы, связанные с библиотекой, в папку с именем библиотеки, например vendor/assets/javascripts/bootstrap
, и в этой же папке добавьте index.js
, который будет действовать как ваш манифест, и Rails автоматически подберет его
если в вашем
app/assets/javascripts/application.js
вы добавляете строку
//= require bootstrap
ТАК ЛЕГКО!!!
Ссылка на Rails Asset Pipeline Guide
Ответ 2
У меня была та же проблема. Я все еще не уверен, что это ошибка или преднамеренное поведение, но кажется, что Rails.application.config.assets.paths
работает только для одиночных файлов, т.е. require jquery
и т.д. По-видимому, пути загрузки активов просто используются для возврата наилучшего соответствия для одного require
, но не для require_directory
или require_tree
.
В моем случае, чтобы загрузить все файлы из vendor/assets/javascripts
, мне пришлось добавить следующее к моему app/assets/javascripts/application.js
:
//= require_tree ../../../vendor/assets/javascripts/.
В вашем случае что-то вроде этого должно работать:
//= require jquery
//= require jquery_ujs
//= require jquery-ui
//= require_directory ../../../../../vendor/assets/javascripts/jquery_plugins
//= require_directory ../../common
//= require_directory ../common
//= require_self
Кажется, что вам всегда нужно использовать относительный путь из файла, в котором вы звоните require_directory
или require_tree
.
Кроме того, я нашел это обсуждение структурирования JS-активов полезным: Конвейер ресурсов Rails 3.1 и вручную заказанный Javascript требует