Я понимаю, что прихожу на эту вечеринку немного поздно, но я хотел добавить решение, которое я использовал в последнее время. Тем не менее, позвольте мне сначала упомянуть ...
Rails 3.1 / 3.2 Way (Нет, сэр. Мне это не нравится.)
Смотрите: http://guides.rubyonrails.org/asset_pipeline.html#how-to-use-the-asset-pipeline
Для полноты изложения я включаю следующее и потому, что это не является нежизнеспособным решением ... хотя меня это не волнует.
«Rails Way» - это решение, ориентированное на контроллеры, а не ориентированное на просмотр, как просил первоначальный автор этого вопроса. Существуют специфичные для контроллера файлы JS, названные в честь соответствующих контроллеров. Все эти файлы помещаются в дерево папок, которое по умолчанию НЕ включено ни в одно из приложений. Js требуют директив.
Чтобы включить специфичный для контроллера код, в представление добавляется следующее.
<%= 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
- Для каждого элемента разбейте значение атрибута на пробел, создав массив строк тегов.
- Для каждой строки тега выполните поиск в хэше для этого тега.
- Если соответствующий ключ найден, запустите связанную с ним функцию, передав элемент в качестве параметра.
Скажем, у меня в файле application.js определено следующее:
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, будет полезно всем, кто сталкивается с этим вопросом в будущем.