как включить файл coffeescript только на одну страницу? - PullRequest
24 голосов
/ 27 ноября 2011

Edit: год спустя, если бы я собирался сделать это снова, я бы сделал это с curl.js вместо конвейера ресурсов Rails.

Похожие: Лучший способ добавить специфичный для страницы javascript в приложение Rails 3?

Я пишу приложение и использую coffeescript для генерации всех js. Вот почему связанный вопрос не делает то, что мне нужно.

Я хотел бы иметь возможность поместить файл coffeescript в подпапку моего каталога ресурсов и сделать так, чтобы этот файл .coffee обрабатывался только на одной странице. Страница находится по названному маршруту

match 'myNotifications' => 'user#notifications'

Самое очевидное, что нужно сделать, это поместить файл .coffee в assets\javascripts\user\index.js.coffee. Но после прочтения документации об активах мне неясно.

Я прочитал эту строку (от http://guides.rubyonrails.org/asset_pipeline.html):

Вы должны поместить любой JavaScript или CSS, уникальный для контроллера, внутри их соответствующие файлы активов, так как эти файлы могут быть загружены только для этих контроллеров с такими строками, как <% = javascript_include_tag params [: controller]%> или <% = stylesheet_link_tag params [: controller] %>.

Ладно, круто, поэтому я добавил js для конкретной страницы в assets\javascripts\user.js.coffee. Затем я перезагрузил мою домашнюю страницу, Ctrl F5. Файл user.js все еще загружается на домашней странице. Протестировано с $ -> alert 'ready from users controller'; видя это предупреждение, когда я загружаю домашнюю страницу.

Есть ли у Rails способ получить файл на странице coffeescript, который будет обслуживаться только с этой страницей? Я неправильно читаю руководство? Есть ли место в папке ресурсов, куда я могу поместить файлы .coffee, чтобы они не загружались на каждой странице?

Обновление : Похоже, я мог бы получить ответ :

Есть несколько способов обойти эту проблему. Мы может использовать require_directory вместо require_tree, так как это будет только загружать файлы в текущем каталоге, а не в подкаталогах. Если мы хотим больше контроля над включенными файлами, мы можем потребовать их отдельно вместо включения всего каталога. В качестве альтернативы мы может переместить файлы JavaScript, которые мы хотим включить во все страницы в публичный подкаталог. Затем мы можем использовать require_tree ./public для включения только этих файлов.

Я сделаю это в AM.

Ответы [ 2 ]

22 голосов
/ 14 февраля 2012

Вот подход, который я использую для создания контроллера / просмотра конкретного Кофе:

application.html.haml:

%body{ :data => { :controller => params[:controller], :action => params[:action]} }

alt.application.html.erb

<%= content_tag(:body, :data => { :controller => params[:controller], :action => params[:action] }) do %>
  ...
<% end %>

application.js.coffee:

$(document).ready ->
  load_javascript($("body").data('controller'),$("body").data('action'))

load_javascript = (controller,action) ->
  $.event.trigger "#{controller}.load"
  $.event.trigger "#{action}_#{controller}.load"

users.js.coffee

$(document).bind 'edit_users.load', (e,obj) =>
  # fire on edit users controller action

$(document).bind 'show_users.load', (e,obj) =>
  # fire on show users controller action

$(document).bind 'users.load', (e,obj) =>
  # fire on all users controller actions

Sidenote:

Это прекрасно работает с PJAX, а также вы можете передавать имена контроллеров / действий с заголовком ответа на запросы PJAX и простозапускать эти функции js на основе этого.

EDIT (2014/03/04): Это решение по-прежнему работает при использовании turbolinks.js .

9 голосов
/ 27 ноября 2011

Вместо того, чтобы включать только файл на одной странице, вы можете просто использовать логику, которая зависит от разметки страницы. См. мой ответ на связанный вопрос . Таким образом, ваши пользователи не должны делать дополнительный <script> запрос для конкретной страницы.

Если есть лот логики, специфичной для этой страницы (скажем, 10K + минимизированный), тогда да, разделите ее. Как вы предложили при редактировании своего вопроса: вместо того, чтобы делать require_tree . в корне вашего каталога javascripts, вместо этого создайте подкаталог с именем global и измените верхнюю часть application.js с

require_tree .

до

require_tree global

Затем поместите свой файл CoffeeScript для конкретной страницы в корневой каталог javascripts и укажите на него с помощью вызова javascript_include_tag в шаблоне этой страницы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...