Rails 3.1: публичный каталог больше не обслуживает ресурсы js. Как загрузить дополнительный файл JS после загрузки страницы?
Я использую плагин jQuery, который загружает другой файл js с сервера после начальной загрузки страницы. Поскольку все ресурсы js объединяются в Rails 3.1, а общедоступный каталог не используется для обслуживания ресурсов js, как я могу ссылаться на этот файл? Куда я это положу?
2 ответа
Каждый актив в пути загрузки Sprockets доступен во время выполнения. Вы можете увидеть свой путь загрузки в консоли Rails с помощью
Rails.application.config.assets.paths
Вы можете добавить пути загрузки в инициализаторе:
Rails.application.config.assets.paths << your_load_path
По умолчанию все ресурсы в приложениях / активах / и поставщике / активах / загружаются автоматически. Эти активы должны быть расположены внутри каталогов. Файлы в самом каталоге assets / не загружаются.
Вы можете загрузить актив, расположенный на apps/assets/javascripts/myscripts/hello.js
посетив http://mydomain.com/assets/myscripts/hello.js.
Конкатенация - это отдельная проблема. Звездочки будут искать в пути загрузки ресурсы, которые вы указали, используя Звездочки require
а также provide
директивы и строить сцепленные файлы из них.
Кажется, нет простого способа сделать это. В Rails 3.1 файлы JavaScript и CSS теперь объединяются в отдельные файлы для отправки в браузер. Это достигается с помощью библиотеки Sprockets.
Механизм для достижения этого включает в себя анализ файла./app/assets/javascripts/application.js и поиск директив Sprockets, которые сообщат Sprockets, где найти соответствующие файлы.
Новый файл application.js во вновь созданном приложении Rails выглядит следующим образом:
// FIXME: Tell people that this is a manifest file, real code should go into discrete files
// FIXME: Tell people how Sprockets and CoffeeScript works
//
//= require jquery
//= require jquery_ujs
//= require_tree .
Они выглядят как комментарии к JavaScript, но обрабатываются Sprockets как директивы, объясняющие, как создать один файл application.js, который будет доставлен клиенту. Вы, вероятно, можете догадаться, что это require_tree
строка, которая добавляется в ваши файлы JavaScript.
По-видимому, нет большого количества документации относительно директив Sprockets. Однако исходный код хорошо документирован и очень хорошо объясняет доступные директивы.
require_tree
Директива рекурсивно включает в себя все файлы в каталоге app / assets / javascripts. Поэтому вы можете достичь желаемого, создав подкаталог и разместив там файлы, которые вы не хотите включать. Вы можете изменить require_tree
в require_path
,
Альтернативой этому может быть ручное управление файлами, которые включены в Sprockets на индивидуальной основе, используя require filename
для каждого необходимого файла JavaScript.