Asset Pipeline и Rails 3.1 JS библиотека, специфичная только для одной страницы в одном контроллере

Я думаю, что документы http://guides.rubyonrails.org/asset_pipeline.html нуждаются в уточнении. Они заявляют:

Например, если сгенерирован ProjectsController, будет новый файл в app/assets/javascripts/projects.js.coffee, а другой - в app/assets/stylesheets/projects.css.scss. Вы должны поместить любой JavaScript или CSS, уникальный для контроллера, в их соответствующие файлы ресурсов, так как эти файлы затем могут быть загружены только для этих контроллеров с такими строками, как <% = javascript_include_tag params [: controller]%> или <% = stylesheet_link_tag params [: controller]%>.

Насколько я понимаю, в производственном режиме все JS предпочтительно упаковываются в один оптимизированный файл. Я предполагаю, что кэширование этого оптимизированного файла предпочтительнее, чем страницы, специально загружающие различные наборы файлов JS.

Возможно, смысл javascript_include_tag в том, чтобы запустить какой-то конкретный javascript для этой страницы. Однако по умолчанию для application.js используется дерево, которое включает в себя созданные файлы. Так что я предполагаю, что это должно быть скорректировано, чтобы НЕ включать какой-либо конкретный контроллер javascript.

Этот ответ здесь Используя Rails 3.1, куда вы помещаете свой "специфичный для страницы" код JavaScript? кажется, предлагает разумный способ решения этой проблемы - связать функции JS с div, и когда JQuery не видит div на странице, ничего не выполняется.

Так что же такое лучшая практика? Правильно ли мое понимание специфики контроллера? Разве по умолчанию включение дерева в application.js противоречит целям контроллера js?

2 ответа

Решение

Вы не должны полагаться на скаффолд application.js, по моему мнению. application.js требуется целое дерево, но это сделано для того, чтобы облегчить начало проекта, это не значит, что он должен оставаться таким.

Вполне вероятно, что вы будете создавать разные "связки" файлов, некоторые из них будут просто включены в определенные страницы.
Например, мой application.js требует только библиотеки и все файлы в папке приложения. Таким образом, вы все равно можете иметь JS для конкретной страницы.

я думаю что <%= javascript_include_tag params[:controller] %> может быть полезно, если у вас есть большие файлы JavaScript, специфичные для какого-либо контроллера.

Это конфликтует - вы должны выбрать один подход (require_tree) или другой (загрузить каждый файл контроллера).

Первый является оптимальным, и он просто нацелен на js для конкретной страницы с классами css.

Единственный раз, когда вы не захотите это делать, это для административных разделов (где вы будете использовать второй манифест) или для какой-либо другой специальной функции, например, галереи лайтбоксов, которая находится только на определенных страницах (поэтому вам не нужны дополнительные js и css везде на сайте).

Другие вопросы по тегам