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 требует