Я понимаю, что приду на эту вечеринку немного поздно, но я хотел добавить решение, которое я использовал в последнее время. Тем не менее, позвольте мне сначала упомянуть ...
Rails 3.1 / 3.2 Way (Нет, сэр. Мне это не нравится.)
См .: http://guides.rubyonrails.org/asset_pipeline.html#how-to-use-the-asset-pipeline
Для полноты изложения я включаю следующее и потому, что это не является нежизнеспособным решением ... хотя меня это не волнует.
"Rails Way" - это решение, ориентированное на контроллеры, а не ориентированное на просмотр, как просил первоначальный автор этого вопроса. Существуют специфичные для контроллера файлы JS, названные в честь соответствующих контроллеров. Все эти файлы помещаются в дерево папок, которое по умолчанию НЕ включено ни в один из приложений. Для директив jj требуются директивы.
Чтобы включить специфичный для контроллера код, в представление добавляется следующее.
<%= javascript_include_tag params[:controller] %>
Я ненавижу это решение, но оно есть и оно быстрое. Предположительно, вместо этого вы можете называть эти файлы чем-то вроде «people-index.js» и «people-show.js», а затем использовать что-то вроде "#{params[:controller]}-index"
, чтобы получить ориентированное на представление решение. Опять же, быстрое решение, но мне это не подходит.
Путь к атрибутам моих данных
Назовите меня сумасшедшим, но я хочу, чтобы ВСЕ мои JS компилировались и минимизировались в application.js при развертывании. Я не хочу помнить, чтобы повсюду включать эти маленькие файлы-бродяги.
Я загружаю все свои JS в один компактный файл, который скоро будет кэширован браузером. Если какой-то кусок моего application.js нужно запустить на странице, я позволяю HTML сообщать мне, а не Rails.
Вместо того, чтобы привязывать мой JS к определенным идентификаторам элементов или засорять мой HTML классами маркеров, я использую пользовательский атрибут данных с именем data-jstags
.
<input name="search" data-jstag="auto-suggest hint" />
На каждой странице я использую - вставьте сюда предпочтительный метод библиотеки JS - для запуска кода после завершения загрузки DOM. Этот код начальной загрузки выполняет следующие действия:
- Перебирать все элементы в DOM, отмеченные
data-jstag
- Для каждого элемента разделите значение атрибута на пробел, создав массив строк тегов.
- Для каждой строки тега выполните поиск в хэше для этого тега.
- Если найден соответствующий ключ, запустите связанную с ним функцию, передав элемент в качестве параметра.
Скажем, у меня в приложении определено следующее:
function my_autosuggest_init(element) {
/* Add events to watch input and make suggestions... */
}
function my_hint_init(element) {
/* Add events to show a hint on change/blur when blank... */
/* Yes, I know HTML 5 can do this natively with attributes. */
}
var JSTags = {
'auto-suggest': my_autosuggest_init,
'hint': my_hint_init
};
Событие начальной загрузки будет применять функции my_autosuggest_init
и my_hint_init
к поисковому вводу, превращая его в ввод, отображающий список предложений при вводе пользователем, а также предоставляя некоторую подсказку при вводе. ввод оставлен пустым и не сфокусированным.
Если какой-либо элемент не помечен data-jstag="auto-suggest"
, код автоматического предложения никогда не срабатывает. Тем не менее, он всегда присутствует, минимизируется и в конечном итоге кэшируется в моем application.js для тех случаев, когда он мне нужен на странице.
Если вам нужно передать дополнительные параметры вашим теговым функциям JS, вам придется применить некоторые творческие возможности. Либо добавьте атрибуты data-paramter, придумайте некоторый синтаксис параметров или даже используйте гибридный подход.
Даже если у меня есть какой-то сложный рабочий процесс, который кажется специфичным для контроллера, я просто создам для него файл в своей папке lib, запакую его в application.js и добавлю к нему что-то вроде 'new-thing-wizard'. Когда мой загрузчик попадет в этот тег, будет создан и запущен мой милый, причудливый волшебник. Он работает для представлений этого контроллера, когда это необходимо, но никак не связан с контроллером. На самом деле, если я правильно закодирую свой мастер, я смогу предоставить все данные конфигурации в представлениях и, следовательно, позже смогу повторно использовать мой мастер для любого другого контроллера, которому он нужен.
Во всяком случае, так я внедрял JS для конкретных страниц некоторое время, и это хорошо мне помогло как для простого дизайна сайта, так и для более сложных / насыщенных приложений.Надеемся, что одно из двух решений, которые я представил здесь, мой путь или путь Rails, пригодится всем, кто сталкивается с этим вопросом в будущем.