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, все работает.

Кто-нибудь знает, что я делаю неправильно? Или это ошибка?


person Pascal Lindelauf    schedule 26.09.2011    source источник


Ответы (2)


Вы можете добавить файл манифеста в каталог, который вы пытаетесь обслуживать, с помощью чего-то вроде 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

person mraaroncruz    schedule 07.02.2012
comment
Я все еще делаю это, поэтому, если есть причина для отрицательных голосов, я хотел бы получить отзывы. - person mraaroncruz; 14.03.2012
comment
намного чище, чем тот, за который проголосовали... что не так с людьми - person Plattsy; 27.03.2012
comment
Это кажется чище, мне это нравится. Однако я не решаюсь сделать это, потому что мне нравится иметь только код поставщика в vendor/, так что, если я изменяю или обновляю что-то там, мне не нужно беспокоиться о перезаписи. код, который я написал. Я подозреваю, что подобное мышление - это то, откуда пришли (бывшие?) отрицательные голоса. - person jpadvo; 30.05.2012
comment
@jpadvo - все хранится в папке vendor/assets. Может быть, я не понимаю вашего вопроса. - я думаю, за это проголосовали три раза, я не удалил комментарий, потому что тогда комментарий @Plattsy не имел бы никакого смысла: D - person mraaroncruz; 31.05.2012
comment
@pferdefleisch Лол. В любом случае, файл манифеста будет настраиваемым кодом для вашего проекта (хотя он действительно прост). Мне не нравится создавать какие-либо файлы в вендоре/даже простые. Тем не менее, это довольно чистый подход, и все сказанное может стоить того. - person jpadvo; 31.05.2012
comment
Если вы переименуете manifest.js в index.js, вы можете просто выполнить //= require jquery_plugins в app/assets/javascripts/application.js. Это то, что предлагает Руководство по конвейеру ресурсов Rails. - person LeEnno; 26.05.2013
comment
@LeEnno Наконец-то обновил это :) - person mraaroncruz; 21.07.2013

У меня такая же проблема. Я до сих пор не уверен, является ли это ошибкой или преднамеренным поведением, но кажется, что 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-активов полезным: javascript-requires">Конвейер ресурсов Rails 3.1 и упорядоченный вручную Javascript требует

person Frane    schedule 30.09.2011
comment
Да, то же самое и с *= require_tree ../../../vendor/assets/stylesheets/. для таблиц стилей. - person LearningRoR; 02.02.2012