Я усвідомлюю, що приїжджаю на цю вечірку трохи пізно, але мені хотілося кинути рішення, яке я використовую останнім часом. Однак дозвольте мені спочатку згадати ...
Шлях Rails 3.1 / 3.2 (Ні, сер. Мені це не подобається.)
Подивитися: http://guides.rubyonrails.org/asset_pipeline.html#how-to-use-the-asset-pipeline
Я включаю наступне заради повноти у цій відповіді, і тому, що це не є життєздатним рішенням ... хоча я не дуже переймаюся цим.
"Шлях рейликів" - це рішення, орієнтоване на контролер, а не орієнтоване на перегляд, як запитував оригінальний автор цього питання. Існують спеціальні файли JS, названі на честь відповідних контролерів. Усі ці файли розміщуються в дереві папок, який НЕ включений за замовчуванням у жоден із застосунків директиви application.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-функцій, вам доведеться застосувати креативність. Або додайте атрибути параметрів даних, придумайте якийсь синтаксис параметрів або навіть використовуйте гібридний підхід.
Навіть якщо у мене є якийсь складний робочий процес, який здається специфічним для контролера, я просто створять файл для нього у своїй папці lib, упакувати його в application.js і позначити його чимось на кшталт "майстра нової речі". Коли мій завантажувач потрапить на цей тег, мій приємний, фантазійний майстер буде створений та запущений. Він працює для перегляду (-ів) цього контролера, коли це необхідно, але не є інакше пов'язаним з контролером. Насправді, якщо я кодую свій майстер право, я можу надати всі дані конфігурації у представленнях даних, і тому зможу пізніше повторно використовувати майстра для будь-якого іншого контролера, який цього потребує.
Так чи інакше, я вже впродовж певного часу впроваджую JS для конкретних сторінок, і це мені добре послужило як для простого дизайну сайтів, так і для більш складних / багатих додатків. Сподіваємось, одне з двох запропонованих нами тут рішень, мій шлях або шлях Рейки, є корисним для всіх, хто в майбутньому стикається з цим питанням.